我已经阅读了无数关于此特定路由错误消息的其他线程,但似乎没有一个与我的情况有关。这是我的代码的简化版本:
要求
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage requestOne)
{
var reqClone = await requestOne.Clone();
var responseOne = await base.SendAsync(requestOne, default(CancellationToken));
var responseTwo = await base.SendAsync(reqClone, default(CancellationToken));
return responseTwo;
}
控制器示例
/// <summary>
/// Create an oRecord.
/// </summary>
/// <param name="cKey">key</param>
/// <param name="oRecord">record</param>
/// <param name="ct">cancellation token</param>
[Route(RouteDefinitions.ExampleRoutes.TestRoute)]
[Authorize]
[HttpPost]
public async Task<IHttpActionResult> Create(string cKey, [FromBody] OResource oRecord, CancellationToken ct)
{
return something;
}
我有一个用于 Get、Detetes、Puts 和 Posts 的控制器设置。无论我们调用什么 HTTP 请求,第一个请求都会到达控制器并执行预期的操作,但第二个请求将立即在 System.Web.Http 中失败,并带有
404:未找到与请求匹配的 HTTP 资源http://request/com/api/v1/example
我还要提到,如果我们在对同一服务器的同一次调用中执行两个不同的请求(即一个 Post 和一个 Get),也会发生同样的事情。
我的控制器路由似乎设置得很好,因为我们第一次调用成功。
有没有人有关于在哪里看的指示?两个调用之间会发生什么会修改路由数据的事情吗?
预先感谢您的帮助!
更新
已修复,但根本原因未知!
我找到了解决问题的方法,但我对根本原因理解了一半。我注意到我的两个请求的 RouteData 是不同的。见下文:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage requestOne)
{
var reqClone = await requestOne.Clone();
IHttpRouteData routeData = requestOne.GetRouteData();
IHttpRouteData clonedRouteData = reqClone.GetRouteData();
var responseOne = await base.SendAsync(requestOne, default(CancellationToken));
IHttpRouteData routeDataAfterRequestOne = requestOne.GetRouteData();
IHttpRouteData clonedRouteDataAfterRequestOne = reqClone.GetRouteData();
var responseTwo = await base.SendAsync(reqClone, default(CancellationToken));
return responseTwo;
}
我发现如果我运行上面的代码,routeData 和 clonedRouteData 都将是 RouteCollectionRouteData 类型。但是,在运行第一个请求后,routeDataAfterRequestOne 和 clonedRouteDataAfterRequestOne都会返回 HttpRouteData 类型。
我仍然不确定为什么RouteData 发生了变化,特别是对于克隆的请求,但它确实发生了。我通过实施以下解决了我的问题:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage requestOne)
{
IHttpRouteData routeData = requestOne.GetRouteData();
var reqClone = await requestOne.Clone();
var responseOne = await base.SendAsync(requestOne, default(CancellationToken));
reqClone.setRouteData(routeData);
var responseTwo = await base.SendAsync(reqClone, default(CancellationToken));
return responseTwo;
}
如果有人知道为什么 RouteData 可能已针对这两个请求进行了更新,请告诉我。我想更好地了解发生了什么。谢谢!