gpt4 book ai didi

c# - 路由和消息处理程序 : request processing order issue

转载 作者:行者123 更新时间:2023-11-30 12:12:15 24 4
gpt4 key购买 nike

我遇到了 ASP.NET Web API 请求管道的执行顺序问题。

根据 ASP.NET Web API 文档(可用 here ),全局消息处理程序应该在路由机制之前执行。

Request pipeline

在这张图片上,MessageHandler1是全局消息处理程序,而 MessageHandler2特定于 Route 2


我创建了一个非常简单的示例来说明执行顺序似乎存在问题……或者我确实遗漏了一些重要的东西。

我有这个 Controller

public class FooController : ApiController {
[HttpPut]
public string PutMe() {
return Request.Method.Method;
}
}

它只接受PUT请求。

应用程序配置如下:

protected void Application_Start() {
var configuration = GlobalConfiguration.Configuration;

configuration.MessageHandlers.Add( new SimpleMethodOverrideHandler() );
configuration.Configuration.Routes.MapHttpRoute(
name: "Foo",
routeTemplate: "api/foo",
defaults: new { controller = "foo", action = "putme" },
constraints: new { put = new HttpPutOnlyConstraint() }
);
}

SimpleMethodOverrideHandler是一个非常简单的 DelegatingHandler只是根据 "method" 更改了请求的方法查询字符串中的参数。

public class SimpleMethodOverrideHandler : DelegatingHandler {
protected override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken ) {
var method = request.RequestUri.ParseQueryString()["method"];
if( !string.IsNullOrEmpty( method ) ) {
request.Method = new HttpMethod( method );
}
return base.SendAsync( request, cancellationToken );
}
}

基本上,请求 /api/foo?method=put在我的浏览器中会启动 FooControllerPutMe方法。
实际上,如前所述,消息处理程序在将请求传递给 HttpRoutingDispatched 之前处理请求。 .

最后,这是约束 HttpPutOnlyConstraint 的实现方式定义:

public class HttpPutOnlyConstraint : IHttpRouteConstraint {
public bool Match( HttpRequestMessage request,
IHttpRoute route,
string parameterName,
IDictionary<string, object> values,
HttpRouteDirection routeDirection ) {
return request.Method == HttpMethod.Put;
}
}

问题是当我请求 /api/foo?method=put 时在我的浏览器中,程序首先输入 HttpPutOnlyConstraintMatch方法,这是错误的。

如果我们引用之前链接的图像,消息处理程序应该首先执行,不幸的是它不是。

所以,当然,Match返回 false并且没有找到请求的 Controller /操作,404 发生。

如果我从路由定义中删除约束,程序将输入 SimpleMethodOverrideHandler ,请求的方法已成功更改,并且能够匹配并执行我的 Controller 的方法。

我做错了什么吗?为了做这样的事情,是否有一个 secret 的配置参数需要知道? :-)

如果有人需要整个项目,可以使用 here [7KB zip file] .

谢谢。

最佳答案

您将路由引擎与 Web API 管道混淆了。 HttpRoutingDispatcher 不是路由引擎的概念。路由约束将首先处理,因为您的底层主机需要构建路由表并匹配您的请求的路由。

HttpRoutingDispatcher 只是 HttpMessageHandler 的另一种实现,它所做的只是检查已匹配路由的 IHttpRoute,然后选择接下来调用哪个消息处理程序。如果不存在每个路由的处理程序,它将处理委托(delegate)给 HttpControllerDispatcher

关于c# - 路由和消息处理程序 : request processing order issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13958853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com