从Web API之外的ActionFilter或ASP.NET MVC Web Controller获取HttpRequestMessage

时间:2017-05-11 15:53:47

标签: asp.net asp.net-mvc caching asp.net-web-api

我有一个凝灰岩时间试图获得HttpRequestMessage的实例,所以我可以从ActionFilter和/或普通的ASP.NET MVC控制器将它传递给下面的方法GetCacheOutputProvider。我知道我可以从Web API,但这些实例呢。

public class CacheResetFilter : ActionFilterAttribute
    {
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var cache = GlobalConfiguration.Configuration.CacheOutputConfiguration().GetCacheOutputProvider(HTTPREQUESTMESSAGE);
                cache.Contains("eventid=" + eventId);

            base.OnActionExecuted(filterContext);
        }

2 个答案:

答案 0 :(得分:1)

1.在MVC控制器中,您可以这样做:

public class HomeController : Controller
{
   public ActionResult Test()
        {
            HttpRequestMessage httpRequestMessage =
                HttpContext.Items["MS_HttpRequestMessage"] as HttpRequestMessage;
            return View();        
        }
 }

2.在动作过滤器中,您可以这样做:

public class HttpRequestMessageAttribute : System.Web.Mvc.ActionFilterAttribute
{
    public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext)
    {
        HttpRequestMessage httpRequestMessage =
            filterContext.HttpContext.Items["MS_HttpRequestMessage"] as HttpRequestMessage;
        //var cache = GlobalConfiguration.Configuration.CacheOutputConfiguration().GetCacheOutputProvider(httpRequestMessage);
        //cache.Contains("eventid=" + eventId);

        base.OnActionExecuted(filterContext);
    }
}

    public class HttpRequestMessageAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            HttpRequestMessage httpRequestMessage =
                filterContext.HttpContext.Items["MS_HttpRequestMessage"] as HttpRequestMessage;

            base.OnActionExecuting(filterContext);
        }
   }

希望对你有帮助。

答案 1 :(得分:0)

我认为没有一种简单的方法。您需要一个HttpRequestMessage类的实例,该实例表示对WebAPI的(当前)请求。但是您不在WebAPI中,并且不处理任何WebAPI请求。因此,合乎逻辑的是,您不能轻易拥有HttpRequestMessage的有效实例(如果可以,它会指向哪个URL?)。恕我直言,最明显的解决方法是使用RegisterCacheOutputProvider中的CacheOutputConfiguration方法注入您自己的缓存提供程序,该缓存提供程序将返回您可以使用其他方法直接访问的IApiOutputCache实例(如全局可见的单身人士)。看起来IApiOutputCache只有一个标准实现:MemoryCacheDefault。所以看起来如果你从注册的提供商处退回,你就没问题。

如果你想变得更加hacky,看起来所有MemoryCacheDefault个实例都在内部使用相同的共享(静态)字段来完成实际的工作,所以你可能只需在你的过滤器中创建new MemoryCacheDefault或控制器,现在仍然可以,但对我而言,与我的答案的第一部分中的替代方案相比,这听起来像是hacky。