服务器宕机时取消 HTTPWebRequest

问题描述 投票:0回答:2

我创建了一个 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();
    }
}

当请求的服务器出现故障时,是否有办法“中断”请求? 我尝试使用网络浏览器调用 API 服务器,一段时间后断开连接,然后向网页返回错误。

c# .net windows-services httpwebrequest
2个回答
1
投票

您可以仅在服务器在线时使用后台工作人员进行检查。它有一些缺点,但可能工作得很好。


1
投票

保持请求异步总是好的(请参阅 HttpWebRequest 中的 BeginXXX 方法 - http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx)。 使用异步 API 可确保您在收到服务器响应之前不会被阻止。

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

© www.soinside.com 2019 - 2024. All rights reserved.