0

我已经阅读了无数关于此特定路由错误消息的其他线程,但似乎没有一个与我的情况有关。这是我的代码的简化版本:

要求

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 可能已针对这两个请求进行了更新,请告诉我。我想更好地了解发生了什么。谢谢!

4

0 回答 0