この特定のルーティング エラー メッセージに関する他のスレッドを無数に読みましたが、私の状況に関連するものはないようです。これが私のコードの単純化されたバージョンです:
リクエスト
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、Put、および Post のコントローラーをセットアップしました。どのような HTTP 要求を呼び出しても、最初の要求はコントローラーに到達し、期待されるアクションを実行しますが、2 番目の要求はすぐに System.Web.Http で失敗します。
404: リクエストに一致する HTTP リソースが見つかりませんでしたhttp://request/com/api/v1/example
また、同じサーバーへの同じ呼び出しで 2 つの異なる要求 (つまり、Post と Get) を実行すると、同じことが起こることにも言及します。
最初の呼び出しが成功するため、コントローラーのルーティングは適切に設定されているようです。
どこを見るべきかについての指針を持っている人はいますか?2 つの呼び出しの間で、ルーティング データを変更する何かが発生している可能性はありますか?
助けてくれてありがとう!
アップデート
直ったけど原因不明!
問題の修正を見つけ、根本的な原因を半分理解しました。2 つのリクエストの 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 が更新された理由を誰かが知っている場合は、お知らせください。何が起こったのかをよりよく理解したいと思います。ありがとう!