从ActionFilter或Web API外部的ASP.NETMVCWeb控制器获取HttpRequestMessage

yrdbyhpb  于 2023-03-31  发布在  .NET
关注(0)|答案(3)|浏览(132)

我有一个凝灰岩时间试图获得一个HttpRequestMessage的instace,这样我就可以从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);
        }
sy5wg1nm

sy5wg1nm1#

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);
        }
   }

希望对你有帮助。

nwwlzxa7

nwwlzxa72#

我不认为有一个简单的方法。你需要一个HttpRequestMessage类的示例,它在语义上表示一个(当前)请求。但您不在WebAPI内部,不处理任何WebAPI请求。因此,您无法轻松获得HttpRequestMessage的有效示例是合乎逻辑的(如果你可以它会指向哪个URL?)。恕我直言,解决这个问题最明显的方法是使用CacheOutputConfiguration中的RegisterCacheOutputProvider方法注入您自己的缓存提供程序,该提供程序将返回一个IApiOutputCache示例,该示例你可以使用其他方式直接访问(比如全局可见的singleton)。看起来IApiOutputCache只有一个标准实现:MemoryCacheDefault。所以看起来如果你从你注册的提供商那里返回它,你就没事了。
如果你想成为一个更黑客的话,看起来所有的MemoryCacheDefault示例内部都使用相同的共享(静态)字段来完成实际工作,所以你可能只需要在过滤器或控制器中创建new MemoryCacheDefault就可以了,但对我来说,这听起来像是一种黑客的方式,与我回答的第一部分的替代方案相比。

odopli94

odopli943#

我在检索httpRequestMessage时遇到了同样的问题,于是我选择了另一条路线。
1.识别:为什么我使用httpRequestMessage?-在我的情况下,我使用它来知道请求是否是 AJAX 请求。
1.修复:只需将httpRequestMessage的功能的用法替换为对应的功能。
我是怎么解决的?
ActionExecutingContext没有检索httpRequestmessage的方法,至少我不知道,我需要httpRequestmessage来获取头“X-Requested-With”。
相反,我使用actionExecutedContext的HttpContext的headers属性来查看是否有这些头,这解决了依赖httpRequestMessage的问题。
我知道这不是你要找的,但这给出了解决这个问题的不同观点,所以在这里发布。
谢谢大家!

相关问题