2012-03-01 4 views

답변

94

다음 코드 내에서 Global.asax에, 나를 위해 작동 : MVC 4 RC의로

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

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

누군가 여기서 일어날 일을 설명 할 수 있습니까? 왜 글로벌 필터가 두 세트입니까? '글로벌'을 모순이라고하지 않습니까? –

+5

필터 집합은 MVC 용이고 다른 필터 집합은 웹 API 용입니다. 그것들은 두 개의 분리 된 것들이며 일반적으로 여러분은 다른 것에 적용되는 필터를 원하지 않을 것입니다. –

+2

내 WebApi 필터가 두 번 호출됩니다. 아무도이 문제가 있습니까? –

11

, 올바른 클래스 이름은 HttpFilterCollection입니다 :

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

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

대신 사용 전역 필터 나는 이것을하기를 더 좋아한다 :

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

그리고 이후 이는 모든 API 컨트롤러를 상속합니다. CustomizedApiControllerBase 이 접근법은 global.ascx 파일의 전역 필터와 비교하여 더욱 표현력이 있습니다. 이 대답은 MVC까지 사실이 보유하고 있음을

62

주 5/웹 API 2

짧은 답변 : MVC와 웹 API 필터가 호환 교차되지 않으며, 당신이 세계를 등록 할 경우, 당신은해야합니다 각각에 대해 적절한 구성 클래스를 사용하십시오.

긴 대답 : ASP.NET MVC와 웹 API는 의도적으로 비슷한 방식으로 작동하도록 설계되었지만 실제로는 다른 생물체입니다.

웹 API는 System.Web.Http 네임 스페이스 아래에 있지만 MVC는 System.Web.Mvc 네임 스페이스 아래에 있습니다. 이 두 모델은 행복하게 나란히 살지만 하나는 다른 모델을 포함하지 않으며 프로그래밍 모델의 유사성에도 불구하고 기본 구현이 다릅니다. MVC 컨트롤러와 웹 API 컨트롤러가 서로 다른 기본 컨트롤러 클래스를 상속하는 것처럼 (MVC의 이름은 Controller이고 웹 API의 이름은 ApiController 임) MVC 필터와 웹 API 필터는 서로 다른 FilterAttribute 클래스를 상속합니다 (이 경우 두 클래스 모두 동일한 이름을 공유하지만 별도입니다. 각각의 네임 스페이스에있는 클래스). 당신이 WebActivator와 프로젝트 템플릿을 사용하는 경우

웹 API 글로벌 필터는 Register 방법 WebApiConfig.cs에서 사용 가능한 HttpConfiguration 객체를 통해 등록 다음의 Global.asax에서

public static void Register(HttpConfiguration config) 
{ 
    //stuff before 
    config.Filters.Add(new MyWebApiFilter()); 
    //stuff after 
} 

하거나. CS :

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter()); 

MVC 글로벌 필터는 프로젝트 FilterConfig.cs의 RegisterGlobalFilters 방법으로 당신에게 사용할 수있는 GlobalFilterCollection 객체의 방법으로 등록하는 WebActivator를 사용하여 다시 사용 :

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     //stuff before 
     filters.Add(new MyMvcFilter()); 
     //stuff after 
    } 
} 

또는 global.asax.WebActivator없는 사람들을 위해 GlobalFilters.Filters 수집의 방법으로 CS 파일 :

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

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

+0

webapiconfig.cs에서 사용자 정의 웹 API 필터를 추가하는 것이 효과적입니다. 내가 global.asax.cs에 추가했을 때 왜 효과가 없었는지 모르겠다. – Tatipaka

+0

@tatipaka에게 감사한다. webapiconfig에 추가되었습니다. – Gokulnath

관련 문제