通过C#中的URI传递CancellationToken

时间:2016-01-26 12:26:44

标签: c# url asp.net-web-api http-get cancellation-token

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

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

第二个示例只是创建url并将其传递给第一个示例中保存的实际控制器,并返回结果。我已经在谷歌搜索了这个问题的答案,但无法找到匹配的内容。

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

1 个答案:

答案 0 :(得分:1)

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

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

  • 如果本地GetReport的呼叫者(即最终用户浏览器)取消其请求(即用户关闭浏览器选项卡),则本地GetReport的{​​{1}是(1)被取消。
  • 这会导致CancellationToken取消其请求。
  • 这会导致(1)远程HttpClient的{​​{1}}取消。

(1)理论上取消。实际上,在ASP.NET取消中有一个老鼠的漏洞,最终结果是取消并非真正保证发生。我希望这将在ASP.NET Core中修复。