program story

내 ASP.NET Web API ActionFilterAttribute OnActionExecuting이 실행되지 않는 이유는 무엇입니까?

inputbox 2020. 10. 31. 09:39
반응형

내 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파일을 다시 확인 했고 실제로 다음 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가 호출됩니다.

This is true for at least WebApi, but I don't know if it applies to MVC.


Here is the complete Implementation:

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

For WebApi, you should install Microsoft.AspNet.WebApi.Core from nuget. For MVC you can use System.Web.MVC.


My problem was much more simple:

Check your Controller is decorated with <actionPreProcessActivitiesAttribute()> _

참고URL : https://stackoverflow.com/questions/12992722/why-is-my-asp-net-web-api-actionfilterattribute-onactionexecuting-not-firing

반응형