HttpContext в WCF - PullRequest
       17

HttpContext в WCF

7 голосов
/ 04 февраля 2011

Я написал простой 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.

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

Ответы [ 3 ]

1 голос
/ 10 марта 2011

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

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

    }

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

1 голос
/ 07 июня 2011

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

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

1 голос
/ 15 февраля 2011

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

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

...