为什么我的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()> _