Почему мой 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 65

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

для WebApi, вы должны установить Microsoft.сеть САШ.Веб-API.Ядро от nuget. Для MVC вы можете использовать систему.Сеть.MVC.

моя задача была гораздо проще:

проверьте, что ваш контроллер украшен <actionPreProcessActivitiesAttribute()> _