为什么我的ASP.NET Web API ActionFilterAttribute的OnActionExecuting不能触发?

我试图实现什么在这里看到: http : NhSessionManagementAttribute但我有我的NhSessionManagementAttribute问题。

我在我的OnActionExecuting(HttpActionContext actionContext)上设置了断点,以查看该函数是否曾经被调用 – 事实并非如此。

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

 GlobalConfiguration.Configuration.Filters.Add(new NhSessionManagementAttribute()); 

我也装饰了我的控制器类本身,以及它的行为与属性无济于事:

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

为什么这个动作filter不会触发内部的任何事件?

如果你在一个包含MVC和WebAPI集合的项目中工作,你可以检查你的ActionFilterAttribute的名字空间是什么名字空间。 这很令人困惑,因为两个ActionFilterAttributes都有两个:

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

上面的答案确实帮助了我 – 为了节省一些时间…这里明显是差别。

标准的MVC控制器使用:

 // System.Web.Mvc public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); } 

OData HTTP控制器使用:

 // System.Web.Http.Filters; public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { base.OnActionExecuted(actionExecutedContext); } 

对于遇到这种情况的其他人来说,当从你的UnitTest调用YourController.YourAction时,ActionFilterAttribute不会触发。

 [TestMethod] public void RevokeSiteAdmin_SessionOver() { FakeDbContext db = new FakeDbContext(); YourController controller = new YourController(db); var result = controller.YourAction(); //Some Assertions } 

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

至lessWebApi是这样的,但我不知道它是否适用于MVC。

这是完整的实现:

 public class AllowCrossSiteJsonAttribute : System.Web.Mvc.ActionFilterAttribute { public override void OnActionExecuted(System.Web.Mvc.ActionExecutedContext filterContext) { if (filterContext.HttpContext != null && filterContext.HttpContext.Response != null && filterContext.HttpContext.Request != null && filterContext.HttpContext.Request.UrlReferrer != null) { var allowedCrossDomains = TypeSafeConfigurationManager.GetValueString("allowedCrossDomains", "none"); var allowedHosts = allowedCrossDomains.Split(','); var requestHost = filterContext.HttpContext.Request.UrlReferrer.GetLeftPart(UriPartial.Authority); if (allowedHosts.Contains(requestHost.ToLower())) { filterContext.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", requestHost); } } base.OnActionExecuted(filterContext); } } public class AllowCrossSiteJsonForWebApiAttribute : ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext.Response != null && actionExecutedContext.Request != null && actionExecutedContext.Request.Headers.Referrer != null) { var allowedCrossDomains = TypeSafeConfigurationManager.GetValueString("allowedCrossDomains", "none"); var allowedHosts = allowedCrossDomains.Split(',').ToList(); var requestHost = actionExecutedContext.Request.Headers.Referrer.GetLeftPart(UriPartial.Authority); if (allowedHosts.Contains(requestHost.ToLower())) { actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", requestHost); } base.OnActionExecuted(actionExecutedContext); } } } 

对于WebApi,您应该从nuget安装Microsoft.AspNet.WebApi.Core。 对于MVC,你可以使用System.Web.MVC。

我的问题更简单:

检查你的控制器装饰有<actionPreProcessActivitiesAttribute()> _