Удаление заголовков из ответа
Мне нужно скрыть некоторые заголовки, сгенерированные ASP.NET и IIS, и возвратиться в ответах службы ASP.NET WebAPI. Заголовки, которые мне нужно скрыть, заключаются в следующем:
- Сервер
- X-Сеть САШ-версия
- X-AspNetMvc-версия
- X-Powered-By
Служба ранее размещалась в WCF, а клоакинг выполнялся в HttpModule, подписываясь на PreSendRequestHeaders и манипулируя HttpContext.Current.Response.Headers. С ASP.NET WebAPI все теперь основано на задачах, поэтому HttpContext.Current имеет значение NULL. Я попытался вставить обработчик сообщений и манипулировать возвращаемым HttpResponseMessage, но заголовки не присутствовали на этом этапе. X-Powered-By можно удалить в настройках IIS, но каков предложенный способ удалить остальные из них?
Ответы
Ответ 1
Проблема заключается в том, что каждая из них добавляется в другой точке:
-
Server
: добавлен IIS. Не совсем уверен, можно ли его отключить, хотя вы, похоже, должны были удалить его с помощью HttpModule.
-
X-AspNet-Version
: добавлено System.Web.dll во время Flush в классе HttpResponse
-
X-AspNetMvc-Version
: Добавлен MvcHandler
в System.Web.dll. Его можно переопределить, чтобы это было нормально.
-
X-Powered-By
с помощью IIS, но можно отключить, как вы сказали.
Я думаю, что ваш лучший выбор по-прежнему использует HttpModules.
Ответ 2
В интересах тех, кто приземляется здесь через поиск google/bing::
Здесь краткое изложение шагов:
Шаг 1: Создайте класс, который выводится из IHttpModule (и IDisposable для очистки, когда мы закончим):
public class MyCustomModule : IHttpModule, IDisposable
{
private HttpApplication _httpApplication
private static readonly List<string> HeadersToCloak = new List<string>
{
"Server",
"X-AspNet-Version",
"X-AspNetMvc-Version",
"X-Powered-By"
};
..
}
Шаг 2: Получите ссылку на внутренний контекст в методе IHttpModule.Init и назначьте обработчик событий событию PreSendRequestHeaders:
public void Init(HttpApplication context)
{
_httpApplication = context;
context.PreSendRequestHeaders += OnPreSendRequestHeaders;
}
Шаг 3: Теперь заголовки можно удалить так:
private void OnPreSendRequestHeaders(object sender, EventArgs e)
{
if (null == _httpApplication)
{
return;
}
if (_httpApplication.Context != null)
{
var response = _httpApplication.Response;
HeadersToCloak.ForEach(header => response.Headers.Remove(header));
}
}
Шаг 4:. Теперь зарегистрируйте этот модуль в корневом web.config под системным .webserver(если здесь включен интегрированный режим IIS 7.0):
<configuration>
<system.webServer>
<modules>
<add name="MyCustomModule" type="<namespace>.MyCustomModule "/>
</modules>
</system.webServer>
</configuration>
Надеюсь, это поможет!
Ответ 3
Если вы используете IIS7/Azure, посмотрите на это:
Удаление/Скрытие/Отключение чрезмерных заголовков HTTP-ответа в Azure/IIS7 без UrlScan
Он показывает лучший способ отключить эти заголовки без использования HttpModules.