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;

第二个示例简单地创建 url 并将其传递给第一个示例中持有的实际控制器,并返回结果。我在谷歌上搜索了这个问题的答案,但找不到任何匹配的东西。

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

4

1 回答 1

2

您当然可以将 a 传递CancellationTokenGetAsync. 它与远程服务器将获得的取消令牌不同,但它们将在逻辑上连接。

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

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

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

于 2016-01-26T14:43:06.150 回答