首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我的ASP.NET网络应用程序接口ActionFilterAttribute OnActionExecuting无法启动?

为什么我的ASP.NET网络应用程序接口ActionFilterAttribute OnActionExecuting无法启动?
EN

Stack Overflow用户
提问于 2012-10-21 05:11:17
回答 4查看 54K关注 0票数 74

我正在尝试实现这里所看到的:http://www.piotrwalat.net/nhibernate-session-management-in-asp-net-web-api/,但是我的NhSessionManagementAttribute有一个问题。

我已经在我的OnActionExecuting(HttpActionContext actionContext)上设置了断点,以查看函数是否被调用过--没有。

我仔细检查了我的global.asax.cs文件,发现我实际上是用以下命令注册了ActionFilter

代码语言:javascript
复制
GlobalConfiguration.Configuration.Filters.Add(new NhSessionManagementAttribute());

我还用属性修饰了我的控制器类本身,以及它的操作,但都没有用:

代码语言:javascript
复制
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;
    }
}

为什么此操作筛选器不会触发其中的任何事件?

EN

回答 4

Stack Overflow用户

发布于 2015-06-26 02:02:39

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

代码语言:javascript
复制
[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。

票数 7
EN

Stack Overflow用户

发布于 2016-02-04 20:02:14

下面是完整的实现:

代码语言:javascript
复制
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);
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-03-08 06:33:39

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12992722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档