在 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 浏览器)取消其请求(即用户关闭浏览器选项卡),则本地 GetReport
的CancellationToken
已取消 (1)。
- 这会导致
HttpClient
取消其请求。
- 这会导致 (1) 远程
GetReport
的 CancellationToken
取消。
(1)理论上应该取消。实际上,ASP.NET 取消中存在大量错误,最终结果是 保证 不会真正发生取消。我希望这将在 ASP.NET Core 中得到修复。
我在一个项目中有一个当前可用的控制器方法,如下所示:
[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 浏览器)取消其请求(即用户关闭浏览器选项卡),则本地GetReport
的CancellationToken
已取消 (1)。 - 这会导致
HttpClient
取消其请求。 - 这会导致 (1) 远程
GetReport
的CancellationToken
取消。
(1)理论上应该取消。实际上,ASP.NET 取消中存在大量错误,最终结果是 保证 不会真正发生取消。我希望这将在 ASP.NET Core 中得到修复。