如何取消同步 WinHttp 请求?

Posted

技术标签:

【中文标题】如何取消同步 WinHttp 请求?【英文标题】:How can a synchronous WinHttp request be cancelled? 【发布时间】:2012-02-14 21:28:39 【问题描述】:

当有人试图停止我的服务时,我的服务有一个线程可能正在执行WinHttpSendRequest

WinHttpCloseHandle documentation 说:

应用程序可以通过使用WinHttpCloseHandle 关闭HINTERNET 请求句柄来终止正在进行的同步或异步请求

但是,后来在同一文档中似乎与此相矛盾。它说:

应用程序永远不应WinHttpCloseHandle 调用同步请求。这可能会产生竞争条件。

我发现this blog post 似乎同意我不能打电话给WinHttpCloseHandle

我想知道如何取消此操作以便可以正常停止我的服务?我真的不能等待WinHttpSendRequest 自然超时,因为它需要的时间太长而且我的服务没有足够快地停止。我认为 Windows 将此报告为错误,然后在关闭时强行终止该服务。

我们将不胜感激。

【问题讨论】:

【参考方案1】:

从后台线程调用WinHttpCloseHandle 来强制关闭句柄可能不是最好的解决方案。它仍然有效,并且原始调用者会收到类似“错误句柄”错误代码的内容,并且请求将被强制终止。

滥用这种权力可能是不安全的,人们宁愿实现异步请求。但是,在关闭陈旧服务的情况下,它会正常工作。

【讨论】:

以上是关于如何取消同步 WinHttp 请求?的主要内容,如果未能解决你的问题,请参考以下文章

wininet 或 winhttp,这是 POST 请求的首选

如何使用带有“传输编码:分块”的 winhttp api

WinHttp.WinHttpRequest 添加到内容类型

VBA - XMLHTTP 和 WinHttp 请求速度

WinHTTP over HTTP/2 多路复用

使用 WinHttp 发布表单