Хранилище WebApi для каждого запроса для режима собственного хостинга

При размещении WebApi в IIS у вас есть доступ к HttpContext и вы можете использовать коллекцию элементов для хранения объектов для одного HTTP-запроса.

При самостоятельном размещении у вас больше нет HttpContext, так что я могу использовать для хранения объекта для одного запроса?


person kimsagro    schedule 12.09.2012    source источник


Ответы (2)


Очевидно, что нет прямого эквивалента HttpContext System.Web в self-host.

Однако, если вы хотите запустить информацию для одного запроса, то каждое сообщение HttpRequestMessage предоставляет словарь ‹string,object›, называемый Properties - http://msdn.microsoft.com/en-us/library/system.net.http.httprequestmessage.properties.aspx, который вы можете использовать, например, для передачи данных между обработчиками, фильтрами, связывателями и т. д.

person Filip W    schedule 12.09.2012
comment
Существует ли глобальный способ хранения объектов вне отдельного запроса. Я хочу иметь возможность кэшировать текущий dbcontext на время жизни запроса и иметь доступ к нему глобально - person kimsagro; 13.09.2012
comment
@kimsagro - вы можете использовать статический ConcurrentDictionary или System.Runtime.Caching.MemoryCache - person EBarr; 13.09.2012
comment
Есть ли способ получить информацию о том, какое сообщение/запрос выполняется, когда у вас нет прямого доступа к HttpRequestMessage? Например, используя какое-то статическое свойство? - person Steven; 23.06.2013

Для selfhost (без участия IIS) вы можете создать класс атрибутов, производный от типа System.Web.Http.Filters.ActionFilterAttribute (в сборке system.web.http .net 4.0+). Затем переопределите метод OnActionExecuted, как показано ниже:

public class NoResponseCachingAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response.Headers.CacheControl == null)
            actionExecutedContext.Response.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue();

        actionExecutedContext.Response.Headers.CacheControl.NoCache = true;
        actionExecutedContext.Response.Headers.CacheControl.NoStore = true;
        actionExecutedContext.Response.Headers.CacheControl.MustRevalidate = true;

        base.OnActionExecuted(actionExecutedContext);
    }
}

Этот подход работал для моего приложения.

person jsa    schedule 08.02.2013