0

我在 Win 7 IIS 上运行一个非常简单的 Web 应用程序(Asp.Net MVC3)。我有一个非常简单的 HTTP GET API,它返回 hello world。

来电:

http://localhost/helloworld

回报:

Hello World!

这可以在浏览器上完美运行。但是,当我编写一个尝试使用网络客户端提取此 URL 的应用程序时,我收到以下错误:

{"Unable to read data from the transport connection: The connection was closed."}

我的代码如下

WebClient web = new WebClient();
var response = web.DownloadString("http://localhost/helloworld");

我的 IIS 设置如下 在此处输入图像描述

我应该看什么?我已经在这几个小时了,我已经没有选择尝试了!任何帮助将不胜感激!

谢谢。

4

2 回答 2

0

我终于弄清楚了问题所在,而不是一个特定于 IIS 的问题——我倾向于这个问题,结果证明这是我编写的代码的问题。

在此处添加详细信息,以防其他人遇到类似问题。

我的代码中有以下方法,用于将请求的响应作为 JSON 对象发送。

private void sendJsonResult(string result) {
    Response.StatusCode = 200;
    Response.Headers.Add("Content-Type", "application/json; charset=utf-8");
    Response.Flush();
    Response.Write(result);
    Response.End();
    Response.Close();    // <-- This is the problem statement
}

经过一番挖掘,我发现我们应该执行 Response.Close()。

一个更好的解释是here。一旦我删除了那条线,它就开始完美地工作了——无论是在我的消费应用程序还是网络浏览器等中。

如果您阅读上面的链接,您将清楚地理解为什么我们不应该使用 Response.Close() - 所以我不会详细说明。今天学到了一个新东西。

于 2012-04-21T13:27:16.400 回答
0

我怀疑这是因为 WebClient 没有发送一些 HTTP 标头:

默认情况下,WebClient 实例不发送可选的 HTTP 标头。如果您的请求需要可选标头,则必须将标头添加到 Headers 集合。例如,要在响应中保留查询,您必须添加用户代理标头。此外,如果缺少用户代理标头,服务器可能会返回 500(内部服务器错误)。http://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.80).aspx

尝试改用 HttpWebRequest。http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx

于 2012-04-12T14:01:23.963 回答