【问题标题】:Get HttpRequestMessage from ActionFilter or ASP.NET MVC Web Controller outside of Web API从 Web API 之外的 ActionFilter 或 ASP.NET MVC Web 控制器获取 HttpRequestMessage
【发布时间】:2017-10-10 17:55:11
【问题描述】:

我正在尝试获取 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);
        }

【问题讨论】:

  • 那么你的问题是什么?
  • 阅读标题好友
  • 检查我的答案。
  • 请求正文只读取一次,并放入 ActionArgument 字典中用于操作过滤器。它应该可以帮助你:stackoverflow.com/questions/21351617/…
  • 我不知道这对我有什么帮助

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


【解决方案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);
        }
   }

希望对你有所帮助。

【讨论】:

  • 当我这样做时它是空的并且为 NULL。
  • 我正在使用 mvc5 和 .net 4.5。我测试它。它有价值。
  • 不在常规 MVC 控制器操作中我的朋友
  • 所以你能分享一些我检查你的问题的细节吗?我对此很感兴趣。
  • 这些都不适用于常规 .NET 控制器,MS_HttpRequestMessage 仅在 Web API 控制器上可用。我会放弃这个。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2013-06-23
    • 2018-06-18
    • 2013-10-30
    相关资源
    最近更新 更多