在 C# 中通过 URI 传递 CancellationToken

Passing a CancellationToken through a URI in C#

我在一个项目中有一个当前可用的控制器方法,如下所示:

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

但这可能会从另一个项目调用,使用以下方法进行传递调用,具体取决于 who/where 调用者是:

[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;

第二个例子只是简单的创建了url并将其传递给第一个例子中持有的实际控制者,returns结果。我搜索了 Google 以寻找对此的答案,但找不到任何匹配的答案。

我可以创建一个取消令牌传递到第二个示例的 GET 中,如图所示,然后将它(与相关搜索信息一起)传递到另一个 GET 中吗? (在另一个远程服务器上 运行)

当然可以pass a CancellationToken to GetAsync。它不会与远程服务器获得的相同取消令牌,但它们将在逻辑上连接。

如果调用进程关闭 HTTP 套接字,则可能 (1) 触发远程 GetReport 中的 CancellationToken。本地 GetReport 可以将 CancellationToken 传递给 HttpClient,这将导致它通过关闭其套接字来取消请求。如果本地 GetReport 传递它获得的 CancellationToken,则应该 (1) 发生以下情况:

  • 如果本地 GetReport 的调用者(即 end-user 浏览器)取消其请求(即用户关闭浏览器选项卡),则本地 GetReportCancellationToken 已取消 (1)。
  • 这会导致 HttpClient 取消其请求。
  • 这会导致 (1) 远程 GetReportCancellationToken 取消。

(1)理论上应该取消。实际上,ASP.NET 取消中存在大量错误,最终结果是 保证 不会真正发生取消。我希望这将在 ASP.NET Core 中得到修复。