Web 请求失败,但仅适用于 localhost 和使用 System.Net.HttpWebRequest

Posted

技术标签:

【中文标题】Web 请求失败,但仅适用于 localhost 和使用 System.Net.HttpWebRequest【英文标题】:Web request fails, but only for localhost and when using System.Net.HttpWebRequest 【发布时间】:2015-02-08 05:42:35 【问题描述】:

System.Net.HttpWebRequest 有一个非常奇怪的问题,这让我抓狂:当我使用localhost 地址运行它时,它要么非常慢(大约 30 秒),要么在大多数情况下,它完全超时。这只发生在以 localhost 为目标的请求中,并且仅来自 C# 代码。

具体来说,以一个 ASP.NET Web API 项目为例,当我有这段代码时:

[Test]
public void TestRequest()

    var request = WebRequest.Create("http://localhost:64497/api/values");
    WebResponse response = request.GetResponse();

..它在大多数情况下都会因为这个异常而失败:

System.Net.WebException:无法连接到远程服务器 ----> System.Net.Sockets.SocketException : 连接尝试失败,因为连接方在一段时间后没有正确响应 时间或建立连接失败,因为连接的主机有 未能响应 127.0.0.1:64497

通过检查 .NET 代码,我找到了 WSAConnect API 返回非空值的错误,但我看不出这有多大帮助。 (但是,这是一个 32 位的 API,而我在 64 位系统上运行。会不会有一些奇怪的 32/64 位问题?)

当我使用 localhost 以外的地址(比如http://www.google.com)运行上述代码时,它会正常运行,并且我得到大约 1 秒的响应时间。 另外,当我从不同的客户端提交上述请求时(我使用 Chrome 的Advanced REST Client),然后我得到正常行为:由于初始编译,第一个请求的延迟时间约为 5-8 秒,响应时间很短所有后续请求的时间(20-40 毫秒)。

鉴于这些发现,在我看来很明显,问题一定来自特定于 System.Net.HttpWebRequest 类的实现...

Web 应用程序本身托管在 IIS Express 上,但我很确定这无关紧要,因为上述请求从未到达 Web 服务器(我通过从命令行运行 IIS Express 然后检查通过以及每个 ProcessMonitor 发出的请求)。

更多信息: 我正在运行 Win 8.1 64bit 和 VS 2013 SP4 pro。 系统的 HOST 文件未修改,即不包含任何条目。

到目前为止我尝试过的事情:

在管理员模式下运行 VS 关闭所有防火墙和防病毒软件 使用 IIS 而不是 IIS Express 根据代码和配置将 proxysettings 显式设置为 null 根据 ProcessMonitor 检查 IIS Express 进程 - 没有结果(正如我所说,我很确定 Web 服务器没有直接涉及此问题) 将localhost 更改为127.0.0.1

我不明白问题出在哪里,我在网上找不到任何相关信息。我什至没有更多的想法可以尝试追踪错误。换句话说:我完全坚持这一点,它有效地阻止了我针对本地托管的 Web 编写任何集成测试。非常感谢任何帮助/提示/提示。

【问题讨论】:

在其他问题中没有答案...希望有一个,因为我也陷入了同样的问题:) 【参考方案1】:

只是为了检查这部分: “通过检查 .NET 代码,我找到了返回非空值的 WSAConnect API 的错误,但我看不出这有多大帮助。(但是,这是一个 32 位 API,而我是在 64 位系统上运行。会不会有一些奇怪的 32/64 位问题?)"

确保在 IIS 中,为应用程序池启用 32 位(默认为禁用)。

另外,我假设绑定设置正确。 (最后一部分 [绑定] 应该是评论,但我没有代表 - 它显然已被删除 - 或将被删除)

【讨论】:

以上是关于Web 请求失败,但仅适用于 localhost 和使用 System.Net.HttpWebRequest的主要内容,如果未能解决你的问题,请参考以下文章

CSRF 验证失败,但仅限 IE9

在 GCC 中将 0 参数传递给可变参数宏失败,但仅在 C++ 中?

Apache Tiles 失败并出现错误,但仅当日志级别设置大于 INFO 时?

3 个最新值,但仅适用于特定用户

PHP脚本适用于localhost,但不适用于Web服务器

等效于@JsonIgnore,但仅适用于使用 Jackson 的 xml 字段/属性转换