HttpContext в WCF

Я написал простой REST API в WCF, а механизм аутентификации использует ключ API. Как только клиент отправляет ключ API в заголовке запроса, я проверяю его на стороне сервера (в классе BaseService, переопределяющем метод ProcessRequest () класса RequestInterceptor) следующим образом:

public partial class BaseService : RequestInterceptor
{
    public BaseService() : base(false) { }

    #region Process Request
    public override void ProcessRequest(ref RequestContext requestContext)
    {
        if (IsValidApiKey(requestContext))
           //put some values in HttpContext object.

     }

...

Теперь я включил совместимость с aspnet в своих службах REST, но я все еще не могу получить доступ к объекту HttpContext в переопределении ProcessRequest выше. Обратите внимание, что HttpContext доступен изнутри метода службы, но не из метода ProcessRequest.

Есть идеи, почему?


person Rajesh Kumar    schedule 04.02.2011    source источник


Ответы (3)


HttpContext, вероятно, инициализируется намного позже в стеке каналов WCF. Помните, что перехватчик каналов запускается в стеке каналов раньше всего и сразу после того, как сообщение было получено от прослушивателя Http-канала. Что вам нужно, чтобы получить доступ к HttpContext от перехватчика запросов ?. Запрос Http доступен как свойство в сообщении, связанном с requestContext. Вы также можете добавить некоторые значения для хранения в пакеты свойств, доступные в сообщении.

Спасибо, Пабло.

person Pablo Cibraro    schedule 15.02.2011

Я решил свою проблему, добавив следующий код:

private HttpContext _httpContext;
public BaseService()
        : base(true)
    {
        _httpContext = HttpContext.Current;            

    }

После этого я могу получить доступ к объекту HttpContext в методе ProcessRequest.

person Rajesh Kumar    schedule 10.03.2011

Однако вы должны заметить, что HttpContext.Current не является потокобезопасным, и то, что настроено для одного потока, может быть изменено другим.

Например к вам на службу приходят два запроса. Вы помещаете некоторое значение в HttpContext в RequestInterceptor для первого запроса. Второй запрос ожидает, пока первый запрос не завершится с RequestInterceptors. Если первый запрос завершается с помощью RequestInterceptors и передается в вашу службу, второй запрос входит в RequestInterceptors и может получить доступ к HttpContext, установленному первым запросом, если первый запрос не завершен. Это своего рода проблемы, с которыми я столкнулся.

person Tomasz Jaskuλa    schedule 07.06.2011