Подтвердить что ты не робот

Возможно ли получить доступ к HttpContext.Current.Session из Web API

Можно ли получить доступ к HttpContext.Current.Session через WebAPI? можем ли мы наследовать IRequiresSession?

У меня есть общий обработчик, выполняющий набор сеансов после вызова API, который я хочу удалить.

public void AccountController : ApiController, IRequiresSessionState
{
public void Login()
{
setsession(){}
} 
}
4b9b3361

Ответ 1

Технически, да, хотя я бы действительно советовал против этой практики - API REST должен быть полностью без гражданства (файлы cookie и другое клиентское состояние в порядке).

Если вы абсолютно должны это сделать, вы можете захватить HTTP-контекст так:

var context = Request.Properties["MS_HttpContext"] as HttpContext;

В этот момент вы просто используете свойство Session, чтобы получить сеанс.

Обратите внимание, что это нарушает определенные контракты, принятые System.Net.Http - в частности, это означает, что ваши контроллеры API никогда не могут быть самообслуживаемыми, потому что они связаны с ASP.NET. Если вы в порядке с этим и с тем фактом, что ваши контроллеры API могут не работать должным образом из веб-фермы, если вы не перепроектируете все, чтобы использовать распределенные сеансы - ну, идите на это.

P.S. Также возможно использовать IRequiresSessionState, но вы не можете использовать его на самом контроллере, вам нужно использовать его на HttpControllerHandler и установить его как RouteHandler. Этот подход обсуждается в этом потоке MSDN. Опять же, я не могу рекомендовать достаточно сильную против эту идею, она нарушает основной принцип веб-API, но, если у вас есть повод для этого, это еще один вариант, который немного более многоразового использования.

Ответ 2

Кастинг, поскольку HttpContext не работал у меня с помощью Web Api 2.1. Однако я мог бы использовать HttpContextWrapper.

var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;