【问题标题】:C# HttpWebRequest.GetResponse() hangs when requesting a method of Azure web role请求 Azure Web 角色的方法时 C# HttpWebRequest.GetResponse() 挂起
【发布时间】:2013-11-15 10:32:59
【问题描述】:

我正在编写代码以在 Windows azure 中向我的 Web 服务发送请求,结果发现在超时之前我无法得到响应。令人困惑的是,我确定我的服务中的所有内容都已完成,但没有回复。

我的服务代码如下所示:

public virtual JsonResult ServiceMethod()
{
    // 1. do the work
    // 2. write something to database

    return Json(result, JsonRequestBehavior.AllowGet);
}

我的客户端代码如下所示:

HttpWebRequest webRequest = WebRequest.Create(new Uri(httpAddress)) as HttpWebRequest;
webRequest.Timeout = 1000 * 1000;
webRequest.ServicePoint.ConnectionLeaseTimeout = 40 * 60 * 1000;
webRequest.ServicePoint.MaxIdleTime = 40 * 60 * 1000;
webRequest.ServicePoint.SetTcpKeepAlive(true, 50 * 1000, 1000);
webRequest.Method = "GET";


using (HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse)
{
    // handle the response
}

现在我很确定我的服务中的代码已经完成,因为我试图向数据库写入一些东西并且发生了。我还检查了托管服务的虚拟机上的 iis 日志,它显示返回了 http 200。但是我的客户端代码中的 GetResponse() 调用挂起,直到达到 1000 秒超时。

更新

我的 Web API 有一个参数会影响方法运行的时间。(为简单起见,我没有在上面的代码中显示它)。如果服务方法运行足够长的时间(如 6 或 7 分钟),则会发生挂起问题。否则,Web 响应可以成功返回。所以我想超时设置中可能存在一些问题。但是 HttpWebRequest 及其基类中有几个超时属性,我不知道它们的什么组合可以导致或解决这个问题。

有什么想法可以解决问题吗? 非常感谢。

【问题讨论】:

  • 运气好能解决这个问题吗?
  • @StijnDeVos 很遗憾没有...这是一个测试项目,不知何故我们不需要它,所以问题从未解决
  • 太糟糕了。我通过实现自定义轮询机制“解决”了这个问题(网络调用启动远程操作,捕获可能的超时异常,轮询状态直到完成)

标签: c# azure httprequest freeze


【解决方案1】:

从您的代码中,并且由于您从您的操作中返回 JsonResult,您似乎拥有一个 RESTful 架构。调试 RESTful 架构的方法之一是使用浏览器,特别是在 HTTP 方法为 GET 的情况下。

您只需在浏览器的地址栏中复制/粘贴您的网址,即可查看是否收到任何响应。如果您看到结果,那么您的客户端代码就是问题所在,否则,问题出在服务器端(azure server)。

要监控 HTTP 流量,一个很好的实用程序是 Fiddler

【讨论】:

  • 感谢您的建议。这是一个宁静的架构,我确实在浏览器中尝试了 api(实际上是使用 chrome 插件邮递员),结果我也没有得到响应。另外,我意识到我错过了原始问题中的一件重要事情。我在更新部分提到过,你能看看这是否有助于解决问题吗?谢谢
【解决方案2】:

在 Windows Azure 模拟器中本地运行您的项目。然后,检查计算模拟器的输出。它应该在那里显示未处理的异常。

似乎调用你的外部服务失败了,异常处理不当。我们之前也遇到过类似的情况,甚至会导致 IIS 工作进程崩溃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多