c# - HttpClient 取消不通知服务器取消

标签 c# web-services httpclient cancellation-token

我正在尝试为 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() 方法,但它们都没有触发服务器端取消。

最佳答案

更新 Nuget 包之后

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

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

关于c# - HttpClient 取消不通知服务器取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46926310/

相关文章:

c# - System.ArgumentNullException 与 NetMQ.Msg.Put()

c# - 在派生对象中使用比父对象定义的类型更强的列表

c# - Debug.Assert 与条件编译

java - XML-22103 : (Fatal Error) DOMResult can not be this kind of node

java - EntityUtils.toString(entity) 抛出 OutOfMemory 错误

C#-SQL : How to execute a batch of StoredProcedure?

c# - 使用 Web 服务遍历 Sharepoint 列表项的属性,得到 "Object reference not set to an instance of an object"

ruby-on-rails-3 - 更改 Rails 默认 JSON/XML 序列化中包含的字段

java - 从 ThreadSafeClientConnManager 连接池取消/中止连接

java - HttpClient类AbstractConnPool变得太大,如何解决?