Asp.net web api WebApi:如何将状态从过滤器传递到控制器?

Asp.net web api WebApi:如何将状态从过滤器传递到控制器?,asp.net-web-api,Asp.net Web Api,我在操作过滤器中提取一些用户数据,并且可以在控制器的操作中使用这些数据,但不确定如何将数据从过滤器传递到控制器。 在MVC中,我可能会使用session或HttpContext.Items,但它在WebAPI中不可用。另一种选择是使用ThreadStatic,但我认为必须有更好的解决方案?您可以使用Request.Properties字典来实现这一点 在过滤器中: MyType myObject = //initialize from somwhere actionContext.Request

我在操作过滤器中提取一些用户数据,并且可以在控制器的操作中使用这些数据,但不确定如何将数据从过滤器传递到控制器。
在MVC中,我可能会使用session或HttpContext.Items,但它在WebAPI中不可用。另一种选择是使用ThreadStatic,但我认为必须有更好的解决方案?

您可以使用
Request.Properties
字典来实现这一点

在过滤器中:

MyType myObject = //initialize from somwhere
actionContext.Request.Properties.Add("mykey", myObject);
然后您可以在控制器中检索它:

object myObject;
Request.Properties.TryGetValue("mykey", out myObject);
//cast to MyType

这种方法的优点是,当前请求实例在Web API管道中随处可见,因此您可以访问此对象,即在格式化程序或MessageHandler中也可以访问此对象。

我的请求对象没有属性,只有参数。有区别吗?它不直接存在于filterContext中,而是存在于filterContext.HttpContext中。然后您要处理的是MVC过滤器而不是Web API过滤器-第一个过滤器用于ASP.NET MVC管道,是system.Web.MVC的成员,而后一个过滤器用于ASP.NET Web API管道,是system.Web.http的成员。不要混淆它们,它们是不同的components@FilipW,我们如何访问服务中的HttpRequestMessage,即使用autofac作为依赖项注入的自定义服务?