HttpContext.Current и Windows Communication Foundation

Случается, порой, так, что из сервисов WCF необходимо обращаться к HttpContext.Current. Когда? Например тогда, когда вы пользуетесь существующими HTTP-модулями (например, безопасность), которые сконфигурированы для всего web-приложения, в т.ч. наших сервисов. В этом случае при попытке обратиться к HttpContext.Current мы получаем null. Что с этим делать?

Вообще, если речь идет конкретно об аутентификационных данных, то правильнее здесь пользоваться ServiceSecurityContext.Current – в этом случае используется система безопасности WCF и клиенты, которые используют эти механизмы аутентификации/авторизации также будут корректно обрабатываться.

В случаях, когда есть необходимость работать именно с HttpContext, этого также можно достичь. Для этого необходимо включить режим совместимости хостинг-среды WCF. Для этого необходимо сделать две вещи:

Первое: Разметить сервис атрибутом AspNetCompatibilityRequirements:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class MetadataService : IMetadata

Второе: В настройках указать, что необходимо использовать режим совместимости ASP.NET:

<system.serviceModel>
    <!-- .... -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

Конечно же такой сервис должен работать на основе HTTP в рамках IIS. Но, собственно, в противном случае HttpContext и смысла то не имеет.

Но все-таки предпочтительнее использовать встроенные механизмы безопасности.