3

上下文: 当前系统有一个自定义的 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 request 看起来像这样,它也是虚拟化的:

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, Type controllerType) 在 System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) 在 System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& 控制器, IControllerFactory& factory)
在 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) 在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication .ExecuteStep(IExecutionStep 步骤,布尔值&

4

2 回答 2

3

好吧,我的同事和我已经想通了...

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

在 global.asax 中,它是:

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

以便 WebApi 路由首先进入 IIS。路由集合中没有忽略方法。

但是,通过首先注册 RouteConfig,您确实有 ignore 方法,然后可以忽略 dav 请求并传递到处理程序。

RouteConfig.RegisterRoutes(RouteTable.Routes);
        WebApiConfig.Register(GlobalConfiguration.Configuration);
于 2012-09-06T13:34:14.753 回答
1

你能在路由上尝试 HttpMethod Constraint http://msdn.microsoft.com/en-us/library/system.web.routing.route.constraints.aspx

于 2012-09-06T00:01:09.720 回答