글로벌 ASP.Net 웹 API 필터를 추가하는 방법은 무엇입니까?


98

Web Api 필터 (사용 System.Web.Http.Filters.ActionFilterAttribute)를 만들었지 만 ASP.Net MVC 4 내에서 작동하도록 할 수 없습니다. RegisterGlobalFilters()메서드에 추가하려고했지만 작동하지 않았습니다.

그렇다면 ASP.Net MVC에서 호스팅되는 Web Api를 사용하는 경우 필터를 어떻게 등록합니까?

답변:


110

내 Global.asax의 다음 코드가 나를 위해 작동합니다.

public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
  filters.Add(new MyWebApiFilter());
}

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}

6
누군가 여기서 무슨 일이 일어나고 있는지 설명 할 수 있습니까? 두 세트의 글로벌 필터가있는 이유는 무엇입니까? 그렇다고 '글로벌'이 모순되지 않습니까?
누가 복음 Puplett

6
한 세트의 필터는 MVC 용이고 다른 세트는 Web API 용입니다. 그것들은 별개의 두 가지이며 일반적으로 하나에 대한 필터가 다른 것에 적용되는 것을 원하지 않을 것입니다.
Shane Courtrille 2012 년

2
내 WebApi 필터가 두 번 호출됩니다. 이 문제가 있습니까?
Andrew Kalashnikov

87

이 답변은 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.FiltersWebActivator가없는 사용자를위한 수집 방식으로 global.asax.cs 파일에서 :

GlobalFilters.Filters.Add(new MyMvcFilter());

두 경우 모두 적절한 FilterAttribute유형 에서 상속 할 필요가 없다는 점은 주목할 가치가 있습니다. Web API 필터는 System.Web.Http.IFilter 인터페이스 만 구현하면되지만 MVC 필터 등록은 클래스가 System.Web.Mvc네임 스페이스에 정의 된 몇 가지 필터 인터페이스 중 하나를 상속하는지 확인합니다 .


webapiconfig.cs에 사용자 지정 Web Api 필터를 추가하면 저에게 효과적입니다. global.asax.cs에 추가 할 때이 일을하지 않은 이유를 이해 해달라고
Tatipaka

감사합니다 @tatipaka. webapiconfig에 추가가 작동했습니다.
Gokulnath

12

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

8

전역 필터를 사용하는 대신 다음을 선호합니다.

[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
   ...
}

그리고 그 후 모든 api 컨트롤러를 상속받습니다. CustomizedApiControllerBase 이 접근 방식은 global.ascx 파일의 전역 필터에 비해 더 표현력이 뛰어납니다.


System.Web.Http.Filters.ActionFilterAttribute에서 상속 된 필터를 만들고 필요한 메서드에서 직접 사용했습니다. 그냥 작동하는데 왜 등록 할 필요가 없나요?
joedotnot

@joedotnot 특정 필터가 아닌 "전역"필터에 관한 것입니다. 필터링 할 방법을 지정할 수 있으면 접근 방식은 괜찮지 만 컨트롤러 작업에 관계없이 필터링하려면 전역 필터가 필요합니다.
Mahmoud Moravej
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.