Asp.NETWebAPI和自定义WebDav处理程序

Asp.NETWebAPI和自定义WebDav处理程序,asp.net,asp.net-web-api,webdav,Asp.net,Asp.net Web Api,Webdav,上下文: 当前系统有一个定制的WebDav HttpHandler,用于处理文件上传、编辑等。 网站是基于WebFrom的。新的WebAPI将建立在这个基础之上 使用Asp.Net提供的示例项目。除了WebDav被破坏之外,集成在所有WebForms和WebAPI方法上都可以正常工作 问题: 在global.asax中注册WebAPI后,HTTP PUT请求始终被发送到WebAPI路由,WebDav的PUT请求将没有匹配项并获得404响应(异常?) 根据这篇[文章][1]看来,HTTPRouti

上下文: 当前系统有一个定制的WebDav HttpHandler,用于处理文件上传、编辑等。 网站是基于WebFrom的。新的WebAPI将建立在这个基础之上

使用Asp.Net提供的示例项目。除了WebDav被破坏之外,集成在所有WebForms和WebAPI方法上都可以正常工作

问题: 在global.asax中注册WebAPI后,HTTP PUT请求始终被发送到WebAPI路由,WebDav的PUT请求将没有匹配项并获得404响应(异常?)

根据这篇[文章][1]看来,HTTPRouting与MVC路由不同。 HttpConfiguration.Routes没有ignore()路由

要实现的目标: PUT请求能够被区分并相应地发送到WebAPI或WebDav处理程序。例如:任何与WebAPI路由模式不匹配的请求都将通过管道传递给处理程序,而不是获得异常响应

WebDav put请求如下所示,也是虚拟化的:

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

路由引擎异常。我要寻找的是一种在没有找到控制器时传递请求的方法,让IIS管道中的其他处理程序/模块来处理请求,而不是抛出错误响应

响应由WebAPI生成,但不会传递到CustomWebDavHandler:

[HttpException]:路径{my WebDav virtual path}的控制器为 未找到或未实现IController。在 System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext,类型controllerType)位于 System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext,String controllerName)位于 System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext、IController和controller、IControllerFactory和factory)
在System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext、异步回调、对象状态)位于 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤, 布尔值(同步完成(&C))


你能试试路线上的HttpMethod约束吗?好的,我的同事和我已经解决了这个问题

RouteConfig.cs和WebApiConfig.cs(这两个文件可以在asp.net的示例中找到)的注册顺序很重要

在global.asax中,它是:

WebApiConfig.Register(GlobalConfiguration.Configuration);
RouteConfig.RegisterRoutes(RouteTable.Routes);
因此WebApi路由首先进入IIS。在route集合中没有ignore方法

但是,通过首先注册RouteConfig(其中有ignore方法),可以忽略dav请求并将其传递到处理程序中

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