답변:
내 Global.asax의 다음 코드가 나를 위해 작동합니다.
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
이 답변은 MVC 5 / Web API 2까지 적용됩니다.
간단한 대답 : MVC 및 Web API 필터는 상호 호환되지 않으며 전역 적으로 등록하려면 각각에 대해 적절한 구성 클래스를 사용해야합니다.
긴 대답 : ASP.NET MVC와 Web API는 의도적으로 비슷한 방식으로 작동하도록 설계되었지만 실제로는 서로 다릅니다.
Web API는 System.Web.Http
네임 스페이스에있는 반면 MVC는 System.Web.Mvc
네임 스페이스에 있습니다. 둘은 나란히 행복하게 살지만 하나는 다른 것을 포함하지 않으며 프로그래밍 모델의 유사성에도 불구하고 기본 구현은 다릅니다. MVC 컨트롤러와 Web API 컨트롤러가 서로 다른 기본 컨트롤러 클래스를 상속하는 것처럼 (MVC는 단순히 이름이 지정 Controller
되고 Web API가 이름이 지정됨 ApiController
) MVC 필터와 Web API 필터는 서로 다른 FilterAttribute
클래스 에서 상속합니다 (이 경우 모두 동일한 이름을 공유하지만 살아있는 별도의 클래스입니다). 각각의 네임 스페이스).
WebActivator에서 프로젝트 템플릿을 사용하는 경우 Web API 전역 필터는 WebApiConfig.cs 메서드 HttpConfiguration
에서 사용할 수 있는 개체를 통해 등록됩니다 Register
.
public static void Register(HttpConfiguration config)
{
//stuff before
config.Filters.Add(new MyWebApiFilter());
//stuff after
}
또는 그렇지 않으면 global.asax.cs에서 :
GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter());
Mvc 전역 필터는 WebActivator를 사용하는 프로젝트에 대해 FilterConfig.cs 메서드 GlobalFilterCollection
를 통해 사용할 수 있는 개체를 통해 등록됩니다 RegisterGlobalFilters
.
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//stuff before
filters.Add(new MyMvcFilter());
//stuff after
}
}
또는 GlobalFilters.Filters
WebActivator가없는 사용자를위한 수집 방식으로 global.asax.cs 파일에서 :
GlobalFilters.Filters.Add(new MyMvcFilter());
두 경우 모두 적절한 FilterAttribute
유형 에서 상속 할 필요가 없다는 점은 주목할 가치가 있습니다. Web API 필터는 System.Web.Http.IFilter 인터페이스 만 구현하면되지만 MVC 필터 등록은 클래스가 System.Web.Mvc
네임 스페이스에 정의 된 몇 가지 필터 인터페이스 중 하나를 상속하는지 확인합니다 .
MVC 4 RC부터 올바른 클래스 이름은 HttpFilterCollection입니다 .
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
전역 필터를 사용하는 대신 다음을 선호합니다.
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
그리고 그 후 모든 api 컨트롤러를 상속받습니다. CustomizedApiControllerBase
이 접근 방식은 global.ascx 파일의 전역 필터에 비해 더 표현력이 뛰어납니다.