-->

为什么我的ASP.NET Web API ActionFilterAttribute OnActio

2019-07-01 13:11发布

我想实现什么在这里看到: 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());

我也装饰我的两个控制器类本身,以及其与属性无济于事操作:

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

为什么会这样操作筛选不能射击任何事件中?

Answer 1:

如果你在一个项目同时包含MVC和的WebAPI assembilies,你可以检查有什么命名空间的ActionFilterAttribute的命名空间。 这是相当混乱的原因有两个下2个ActionFilterAttributes:

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


Answer 2:

上面肯定的回答帮我 - 救别人一些时间......这里是明确的区别。

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


Answer 3:

对于其他人谁碰到这个来了,从你的单元测试调用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将被调用。

这是真实的,至少的WebAPI,但我不知道它是否适用于MVC。



Answer 4:

下面是完整的实施:

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


Answer 5:

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



Answer 6:

我的问题是要简单得多:

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



文章来源: Why is my ASP.NET Web API ActionFilterAttribute OnActionExecuting not firing?