将ActionFilter.OnActionExecuting()中的对象传递给ApiController

cam*_*ase 12 action-filter asp.net-web-api

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

public class DbReadonlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Request.Properties["CustomObjectKey"] = new MyClass();
Run Code Online (Sandbox Code Playgroud)

我还尝试将新对象直接分配给ControllerBase类.

public class DbReadonlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        var controller = (MyControllerBase) actionContext.ControllerContext.Controller;
        controller.StorageContextFactory = new MyClass();
Run Code Online (Sandbox Code Playgroud)

问题是这两种技术都没有将MyClass的实例传递给控制器​​,因为在调用控制器方法时,新的Property ["CustomObjectKey"]在Webapi管道中丢失了.

在调用操作过滤器OnActionExecuting()之后,控制器由webapi管道重新实例化.

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

  • 构造函数MyControllerBase()
  • MyAuthenticationFilter
  • 过滤OnActionExecuting()
  • 构造函数MyControllerBase()
  • MyController.MethodA()

MyControler的双实例化是奇怪的,但是现在我正在寻找任何技术将新创建的对象从动作过滤器传递给控制器​​.

编辑1:此问题的v1中提到的MyAuthorizationFilter实际上是一个身份验证过滤器.还在调查.

解决方案:该错误在另一个过滤器中.删除我的身份验证过滤器后,此问题中报告的问题就消失了.

Sam*_*azi 17

您将不得不使用.add方法Request.Properties集合.

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

您可以从api控制器中检索此值.

object _customObject= null;

if (Request.Properties.TryGetValue("CustomObjectKey", out _customObjectKey))
{
    MyClass myObject = (MyClass)_customObject;
}
Run Code Online (Sandbox Code Playgroud)