2012-09-05 3 views
3

상황 : 현재 시스템은 파일 업로드를 처리하는 장소에 사용자 지정의 WebDAV HttpHandler를, 편집 등 을 가지고 있으며, 웹 사이트가 WebFrom을 기반으로합니다. 그리고 새로운 WebAPI가 그 위에 구축 될 것입니다.Asp.Net WebAPI 및 사용자 정의의 WebDAV 처리기

Asp.Net을 사용하여 예제 프로젝트를 제공했습니다. 통합은 WebDav가 깨진 경우를 제외하고는 모든 WebForms 및 WebAPI 메소드를 제외하고 정상적으로 작동합니다.

문제 : Global.asax에있는 WebAPI를 등록하면, 항상 WebAPI 라우팅 및 WebDAV의 PUT 요청에 보낸있어는 HTTP PUT 요청이 일치해야하고 404 응답받지 않습니다 (예외?).

이 기사 [1]에 따르면 HTTPRouting은 MVC 라우팅과 다릅니다. HttpConfiguration.Routes에는 ignore() 경로가 없습니다.

목표 달성 : PUT 요청은 구별 될 따라 WebAPI 또는 WebDAV를 핸들러로 전송받을 수 있습니다. 예 : WebAPI 라우트 패턴과 일치하지 않는 요청 요청은 예외 응답을받는 대신 파이프 라인을 따라 처리기로 전달됩니다.

의 WebDAV PUT 요청뿐만 아니라 가상화 된이, 다음과 같습니다 라우팅 엔진에서

PUT /dav/{USERID}/{AUTH_TOKEN}/{PRAMS}/{PATHINFO}2.png 

--Edits

예외입니다. 내가 찾고있는 건 컨트롤러를 찾을 수 없을 때 요청을 통과시키는 방법이다. IIS 파이프 라인에있는 다른 핸들러/모듈로 하여금 오류 응답을 던지기보다는 요청을 처리하게한다.

응답은 WebAPI에 의해 생성하고 그것은 CustomWebDavHandler에 전달되지 않습니다

[HttpException] : 경로에 대한 컨트롤러 {내 WebDAV를 가상 경로는} 찾을 수 없습니다 또는 IController를 구현하지 않습니다. System.Web.Mvc.DefaultControllerFactory.GetControllerInstance System.Web.Mvc.MvcHandler.ProcessRequestInit에서 System.Web.Mvc.DefaultControllerFactory.CreateController에서 (RequestContext requestContext, 유형 controllerType) (RequestContext requestContext, 문자열 컨트롤러 명) (에 HttpContextBase 으로 HttpContext, IController & 컨트롤러, System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication에서 IControllerFactory & 공장) System.Web.Mvc.MvcHandler.BeginProcessRequest에서
(HttpContextBase 으로 HttpContext, AsyncCallback 콜백 상태 개체) .ExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep 때 (IExecutionStep 단계, 부울 & completedSynchronously)

답변

3

좋아, 내 동료를 HttpMethod 제약 조건을 시도 할 수 있습니다 내가 ...

을이 알아 낸

RouteConfig.cs 및 WebApiConfig.cs의 등록 순서 (이 두 파일은 ASP에서 찾을 수 있습니다.그물의 예) 중요한 있습니다 .. Global.asax에에서

, 그것은이었다

WebApiConfig.Register(GlobalConfiguration.Configuration); 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

그래서 WebApi 노선 먼저 IIS에 얻을 수있다. 경로 수집에 무시 방법이 없습니다.

하지만 먼저 ignore 메소드가있는 RouteConfig를 등록하면 dav 요청을 무시하고 처리기로 통과시킬 수 있습니다.

RouteConfig.RegisterRoutes(RouteTable.Routes); 
     WebApiConfig.Register(GlobalConfiguration.Configuration);