簡體   English   中英

為什么我的ASP.NET Web API ActionFilterAttribute OnActionExecuting無法啟動?

[英]Why is my ASP.NET Web API ActionFilterAttribute OnActionExecuting not firing?

我正在嘗試實現此處看到的內容: 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;
    }
}

為什么該動作過濾器不會觸發其中的任何事件?

如果您正在同時包含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。

至少對於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,您應該從nuget安裝Microsoft.AspNet.WebApi.Core。 對於MVC,可以使用System.Web.MVC。

我的問題要簡單得多:

檢查您的控制器是否裝飾有<actionPreProcessActivitiesAttribute()> _

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM