为什么我的ASP.NET Web API ActionFilterAttribute OnActionExecuting没有触发?

sla*_*shp 70 c# action-filter actionfilterattribute asp.net-web-api

我正在尝试实现这里看到的内容:http://www.piotrwalat.net/nhibernate-session-management-in-asp-net-web-api/但我遇到了问题NhSessionManagementAttribute.

我已经设置了断点OnActionExecuting(HttpActionContext actionContext),看看函数是否被调用 - 事实并非如此.

我仔细检查了我的global.asax.cs文件,发现我实际上正在注册ActionFilter:

GlobalConfiguration.Configuration.Filters.Add(new NhSessionManagementAttribute());
Run Code Online (Sandbox Code Playgroud)

我还装饰了我的控制器类本身,以及它对属性的操作无济于事:

public class ClientsController : ApiController {
    static readonly ClientRepository repository = new ClientRepository();

    [NhSessionManagement]
    public IEnumerable<Client> GetAllClients() {
        return repository.GetAll();
    }

    [NhSessionManagement]
    public Client GetClient(int id) {
        Client client = repository.Get(id);
        if (client == null) {
            throw new HttpResponseException(
                new HttpResponseMessage(HttpStatusCode.NotFound)
            );
        }
        return client;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么此操作过滤器不会触发其中的任何事件?

小智 154

如果您正在一个包含MVC和WebAPI组件的项目中工作,您可以检查ActionFilterAttribute命名空间的命名空间是什么.这是相当令人困惑的,因为两者下都有两个ActionFilterAttributes:

  • WebAPI:System.Web.Http.Filters
  • MVC:System.Web.Http.Mvc

  • MVC:System.Web.Http.Mvc - > System.Web.Mvc在某些ASP.NET MVC版本中 (4认同)
  • WebApi的ActionFilterAttribute位于System.Web.Http.dll程序集中. (3认同)
  • 我还是很困惑.对于WebAPI,为什么System.Web.Http.Filters.ActionFilterAttribute不是合适的选择?答案只是说检查命名空间并说明有两个.它没有解释为什么你不使用WebAPI. (3认同)

Pro*_*ega 33

上面的答案肯定帮助了我 - 拯救他人一些时间......这里显然是区别.

标准MVC控制器使用:

// System.Web.Mvc
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
}
Run Code Online (Sandbox Code Playgroud)

OData HTTP控制器使用:

// System.Web.Http.Filters;
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
    base.OnActionExecuted(actionExecutedContext);
}
Run Code Online (Sandbox Code Playgroud)

  • System.Web.Http.Filters也适用于WebApi.如果使用Ninject,重要的是要注意过滤器绑定在Mvc与Http的不同库中.Mvc - Ninject.Web.Mvc WebApi/Http - Ninject.Web.WebApi (3认同)

Joh*_*arr 5

对于遇到此问题的其他任何人,从UnitTest调用YourController.YourAction时均不会触发ActionFilterAttribute。

[TestMethod]
public void RevokeSiteAdmin_SessionOver()
{
    FakeDbContext db = new FakeDbContext();

    YourController controller = new YourController(db);
    var result = controller.YourAction();

    //Some Assertions
}
Run Code Online (Sandbox Code Playgroud)

在上面的TestMethod中,不​​会调用YourController.YourAction上的任何ActionFilterAttributes。然而; 如果从浏览器调用YourController.YourAction,则将调用ActionFilterAttribute。

至少对于WebApi来说是这样,但是我不知道它是否适用于MVC。