1

私は現在、1 つのプロジェクトで次のようなコントローラー メソッドを使用しています。

[HttpGet]
public async Task<IHttpActionResult> GetReport([FromUri] ReportParamiters ReportRequest, CancellationToken cancellationToken)
{…}

ただし、これは、呼び出し元が誰/どこにいるかに応じて、次を使用してパススルー呼び出しを行う別のプロジェクトから呼び出すことができます。

[HttpGet]
public async Task<HttpResponseMessage> GetReport([FromUri] ReportParameters ReportParameters, CancellationToken cancellationToken)
{
        using(HttpClient client = this.MessageTransferHelper.BuildJsonHttpClient(Helper.BearerToken(this.Url.Request.Headers.Authorization.ToString())))
            {
                HttpResponseMessage response =
                    await
                        client.GetAsync(this.ConfigurationService.ReportsUrl() + "report1/?DateFrom=" +
                                        ReportParameters.DateFrom.ToString("MM-dd-yyyy") + "&DateTo=" + ReportParameters.DateTo.ToString("MM-dd-yyyy") +
                                        "&valueList=" + String.Join("&valueList=", ReportParameters.Stores.ToArray()));
                return response;

2 番目の例は単に URL を作成し、それを最初の例で保持された実際のコントローラーに渡し、結果を返します。これに対する回答を Google で検索しましたが、一致するものが見つかりません。

示されているように、2 番目の例の GET に渡されるキャンセル トークンを作成し、それを (関連する検索情報と共に) 他の GET に渡すことはできますか? (別のリモートサーバーで実行されています)

4

1 に答える 1

2

確かに aを to に渡すCancellationTokenGetAsyncことができます。リモート サーバーが取得するのと同じキャンセル トークンにはなりませんが、それらは論理的に接続されます。

呼び出しプロセスが HTTP ソケットを閉じるとCancellationToken、リモートのmay (1) がトリガーされます。GetReportlocalはtoGetReportを渡すことができます。これにより、ソケットを閉じてリクエストをキャンセルできます。ローカルが取得した を渡す場合、次のはずです(1):CancellationTokenHttpClientGetReportCancellationToken

  • local の呼び出し元GetReport(つまり、エンドユーザーのブラウザー) がその要求をキャンセルした場合 (つまり、ユーザーがブラウザーのタブを閉じた場合)、 localGetReportCancellationTokenis(1) はキャンセルされます。
  • これにより、 はHttpClientその要求をキャンセルします。
  • これにより、(1) リモートGetReportCancellationTokenキャンセルされます。

(1)理論上は解消されるはずです。実際には、ASP.NET のキャンセルにはネズミの巣状のバグがあり、その結果、キャンセルが実際に発生する保証はありません。これは ASP.NET Core で修正されると思います。

于 2016-01-26T14:43:06.150 に答える