【问题标题】:HttpClient cancellation doesn't inform server of cancellationHttpClient 取消不会通知服务器取消
【发布时间】:2017-10-25 07:20:20
【问题描述】:

我正在尝试为 OWIN Web 服务创建一个客户端,该客户端会在请求被取消时通知该服务,因此该服务也可以取消该请求当前正在进行的工作。

在服务器端,我有一个使用此方法的 ApiController:

[HttpGet]
[Route("Get")]
public int Get(CancellationToken ct)
{
  Console.WriteLine("started!");

  while (!ct.IsCancellationRequested)
  {
    Thread.Sleep(500);
  }

  Console.WriteLine("canceled!");

  return 0;
}

如果我通过 Edge 访问 API,它可以工作(一旦我中止加载、导航到其他地方、关闭选项卡或关闭浏览器,我就会收到“已取消!”消息),但是我尝试过的所有其他方法( Chrome、Postman、HttpClient、HttpWebRequest),CancellationToken 只是不会被取消。 Edge 与所有其他应用程序有什么不同,可以做些什么来让它与 HttpClient 一起工作?我尝试使用 CancellationToken 调用 GetAsync() 并取消它,我尝试了 HttpClient 的 Dispose() 和 CancelPendingRequests() 方法,但它们都没有触发服务器端取消。

【问题讨论】:

  • 我刚刚更新了 Owin 的 Nuget 包,现在它似乎可以工作了。如果我可以确认,稍后会发布答案。

标签: c# web-services httpclient cancellation-token


【解决方案1】:

更新 Nuget 包后

Microsoft.Owin
Microsoft.Owin.Host.HttpListener
Microsoft.Owin.Hosting
Microsoft.Owin.SelfHost

到 v3.1.0,取消工作不仅可以从 Edge 进行,还可以从 Chrome 和 HttpClient 进行。我再次将软件包降级到 v2.0.0 以排除其他原因,并且可以确认较新的版本解决了问题。不过,我仍然很好奇为什么它甚至在升级之前就可以在 Edge 中运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多