Почему мой ASP.NET Web API ActionFilterAttribute OnActionExecuting не стреляет?
Я пытаюсь реализовать то, что видел здесь:http://www.piotrwalat.net/nhibernate-session-management-in-asp-net-web-api/ но у меня проблема с моим NhSessionManagementAttribute
.
Я установил точки останова на моем OnActionExecuting(HttpActionContext actionContext)
чтобы увидеть, была ли функция когда-либо вызвана-это не было.
Я дважды проверил мой global.asax.cs
file & found я на самом деле регистрирую 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;
}
}
почему этот фильтр действий не будет запускать какие-либо события внутри?
6 ответов:
Если вы работаете в проекте, содержащем как MVC, так и WebAPI assembilies, не могли бы вы проверить, какое пространство имен является пространством имен вашего ActionFilterAttribute. Это довольно запутанно, потому что есть два ActionFilterAttributes под обоими:
- WebAPI: Система.Сеть.Http.Фильтры
- MVC: система.Сеть.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); }
для всех, кто сталкивается с этим, ActionFilterAttribute не будет срабатывать при вызове YourController.Ваше действие от вашего UnitTest.
[TestMethod] public void RevokeSiteAdmin_SessionOver() { FakeDbContext db = new FakeDbContext(); YourController controller = new YourController(db); var result = controller.YourAction(); //Some Assertions }
в TestMethod выше, любые ActionFilterAttributes на вашем контроллере.Ваше действие не будет называться. Однако; если вы вызываете YourController.YourAction из браузера, ваш ActionFilterAttribute будет вызван.
Это верно, по крайней мере, для WebApi, но я не знаю, относится ли это к 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); } } }