Asp.net web api 将ActionFilter.OnActionExecuting()中的对象传递给ApicController

Asp.net web api 将ActionFilter.OnActionExecuting()中的对象传递给ApicController,asp.net-web-api,action-filter,Asp.net Web Api,Action Filter,我希望在ActionFilter中为每个http请求创建一个对象,并将该对象传递给控制器。到目前为止,我已经尝试了Request.Properties[],如下所示 public class DbReadonlyAttribute : ActionFilterAttribute { public override void OnActionExecuting(HttpActionContext actionContext) { actionContext.Requ

我希望在ActionFilter中为每个http请求创建一个对象,并将该对象传递给控制器。到目前为止,我已经尝试了Request.Properties[],如下所示

public class DbReadonlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Request.Properties["CustomObjectKey"] = new MyClass();
我还尝试将新对象直接分配给ControllerBase类

public class DbReadonlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var controller = (MyControllerBase) actionContext.ControllerContext.Controller;
        controller.StorageContextFactory = new MyClass();
问题在于,这两种技术都没有将MyClass的实例交付给控制器,因为在调用控制器方法时,Webapi管道中的新属性[“CustomObjectKey”]已丢失

在调用action filter OnActionExecuting()之后,webapi管道将重新实例化控制器

断点确认Webapi管道在单个http请求期间调度以下事件流

  • 构造函数MyControllerBase()
  • MyAuthenticationFilter
  • 过滤器OnActionExecuting()
  • 构造函数MyControllerBase()
  • MyController.MethodA()
mycontroller的双重实例化很奇怪,但现在我正在寻找将新创建的对象从动作过滤器传递到控制器的任何技术

object _customObject= null;

if (Request.Properties.TryGetValue("CustomObjectKey", out _customObjectKey))
{
    MyClass myObject = (MyClass)_customObject;
}
编辑-1:本问题v1中提到的MyAuthorizationFilter实际上是一个身份验证过滤器。仍在调查中


解决方案:该错误位于另一个过滤器中。删除身份验证筛选器后,此问题中报告的问题消失。

您必须使用
.add
方法
请求.Properties
集合

public class DbReadonlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Request.Properties.Add(new KeyValuePair<string, object>("CustomObjectKey", new MyClass()));

将变量从ActionFilter.OnActionExecuting()传递到ApiController的另一种方法:

公共类CustomFilterAttribute:System.Web.Http.Filters.ActionFilterAttribute
{
公共覆盖无效OnActionExecuting(ActionExecutingContext actionContext)
{
actionContext.ControllerContext.RequestContext.RoutedData.Values[“CustomValue”]=“CustomValue”;
}
}
注意为Web API使用ActionFilterAttribute:

System.Web.Http.Filters.ActionFilterAttribute

对于MVC经典:

System.Web.Mvc.ActionFilterAttribute

使用:

[CustomFilter]
公共类控制器:ApiController
{
字符串customValue=RequestContext.RouteData.Values.ToDictionary(x=>x.Key,y=>y.Value)[“用户id”].ToString();
//...
}

感谢您的输入,在应用您的代码更改后,我仍然会遇到问题,现在我怀疑我的身份验证筛选器中的异步链接存在更深层次的问题。我一直在使用我在答案中粘贴的代码。它对我来说工作得很好,我通过删除WebApiConfig中声明为config.Filters.Add(x)的全局身份验证过滤器简化了问题;使用您的示例和我的原始属性[“CustomObjectKey”]=技术从我的操作过滤器传递到控制器的对象对这两个示例都有效。我现在正在调查我的身份验证过滤器导致问题的原因,例如双控制器实例化。如果我解决了这个问题,我会回来相信你的回答,因为你的建议导致我寻找更深层次的问题。将此标记为正确答案是因为有可能通过请求属性将对象引用从操作筛选器传递给控制器,这迫使我查看导致解决方案的整个筛选器链。