C# 服务器关闭时取消HTTPWebRequest

C# 服务器关闭时取消HTTPWebRequest,c#,.net,api,windows-services,httpwebrequest,C#,.net,Api,Windows Services,Httpwebrequest,我创建了一个Windows服务,它使用HTTPWebRequest调用API(返回JSON) API在有东西要“交付”之前不会返回任何东西。因此,我将超时设置得相当高,并让请求等待,直到收到响应 问题是,当我测试关闭或断开运行API的服务器时。HTTPWebRequest不会停止请求。所以我不知道API服务器是否已经关闭 请求代码: HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(Url); Request.Metho

我创建了一个Windows服务,它使用HTTPWebRequest调用API(返回JSON)

API在有东西要“交付”之前不会返回任何东西。因此,我将超时设置得相当高,并让请求等待,直到收到响应

问题是,当我测试关闭或断开运行API的服务器时。HTTPWebRequest不会停止请求。所以我不知道API服务器是否已经关闭

请求代码:

HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create(Url);
Request.Method = "POST";
Request.ContentType = "application/x-www-form-urlencoded";
Request.ContentLength = PostData.Length;
Request.Timeout = Timeout;
Request.KeepAlive = true;
using (StreamWriter sw = new StreamWriter(Request.GetRequestStream()))
{
    sw.Write(PostData);
}
using (HttpWebResponse Response = (HttpWebResponse)Request.GetResponse())
{
    using (StreamReader sr = new StreamReader(Response.GetResponseStream()))
    {
        ResponseText = sr.ReadToEnd();
    }
}
当请求的服务器停机时,是否仍有“中断”请求的方法?
我曾尝试使用webbrowser调用API服务器,过了一段时间后断开连接,并返回一个错误到网页。

只有在服务器联机时,才可以使用后台工作程序。它有一些缺点,但可以很好地工作。

保持请求异步总是好的(请参阅HttpWebRequest中的BeginXXX方法-)。 使用异步API可以确保在收到服务器的响应之前不会被阻止


除了使用异步API之外,还可以使用心跳请求(这可能只是对服务器上ping服务的头HTTP请求,返回一个空正文和HTTP 200状态),以跟踪服务器是否处于活动状态。如果此请求超时,则服务器不活动-在这种情况下,您可以取消/只是“忘记”已发出请求。

是的,我想到了这一点。但是如果可能的话,我想避免。你说的“HTTPWebRequest不会停止请求”是什么意思?如果发生超时或套接字引发异常,将引发异常。对于那些建议背景的人,ping:这是一个种族条件。如果ping成功,服务器在第二秒关闭,下面的请求将失败。我将超时设置为天,因为这是响应可能需要的时间。当远程服务器断开连接时,我没有遇到另一个异常,这基本上是我的问题。它似乎在继续等待响应。我目前正在自己的线程中运行HTTPWebRequest,因此它不应该阻止NNED运行的其他东西。但是异步调用可能会更好?ping/心跳可能是检查服务器是否联机的唯一方法。在自己的线程中发出HTTP请求可能不会阻止应用程序,但请求本身不是异步的,即该线程被有效阻止。使用异步API确保请求已提交,然后在有响应时执行回调,这让您知道请求已完成。(但是,在这种特殊情况下,如果服务器关闭,它可能永远不会出现)。@AndreasBergqvist,希望您的问题得到解决。你有没有尝试过这个解决方案,或者其他什么?事实上,没有,让它异步并不总是好的。OP正在自己的线程中运行他的HttpWebRequest,因此它已经与OP的主线程异步。此外,很多时候,人们需要同步web请求,尤其是在web请求返回数据之前无法完成其他工作的情况下。