Удаление заголовков из ответа

Мне нужно скрыть некоторые заголовки, сгенерированные 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>

Надеюсь, это поможет!