13

我已经构建了一个简单的 Web 服务,它只使用 HttpListener 来接收和发送请求。有时,服务会因“指定的网络名称不再可用”而失败。当我写入 HttpListenerResponse 的输出缓冲区时,它似乎被抛出。

这是错误:

ListenerCallback() 错误:指定的网络名称在 System.Net.HttpResponseStream.Write(Byte[] buffer, Int32 offset, Int32 size) 不再可用

这是代码的有罪部分。responseString 是发送回客户端的数据:

buffer = System.Text.Encoding.UTF8.GetBytes(responseString);

response.ContentLength64 = buffer.Length;
output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);

它似乎并不总是一个巨大的缓冲区,两个例子是 3,816 字节和 142,619 字节,这些错误相隔大约 30 秒抛出。我不认为我的单个客户端应用程序会超载 HTTPlistener。客户端偶尔会突发发送/接收数据,几次交换接连发生。

大多数谷歌搜索显示这是一个常见的 IT 问题,当出现网络问题时,会显示此错误——大多数帮助针对的是系统管理员诊断应用程序的问题,而不是开发人员追踪错误。我的应用程序已经在不同的机器、网络等上进行了测试,我认为这不仅仅是一个网络配置问题。

这个问题的原因可能是什么?

4

5 回答 5

6

ContentLength64当指定 a 并且KeepAliveis时,我也得到了这个false。似乎客户端正在检查Content-Length标头(所有可能的帐户都正确设置了标头,因为我得到任何其他值的异常)然后说“Whelp I'm done KTHXBYE”并稍微关闭连接在底层HttpListenerResponse流期望它之前。现在,我只是捕捉到异常并继续前进。

于 2009-09-04T17:11:08.227 回答
1

当您尝试响应无效请求时会出现此问题。看看这个。我发现解决这个问题的唯一方法是:

listener = new HttpListener();
listener.IgnoreWriteExceptions = true;

只需在实例化您的侦听器后将IgnoreWriteExceptions设置为 true,错误就消失了。


更新:
为了更深入的解释,Http协议基于TCP协议,该协议与每个对等方写入数据的流一起工作。TCP协议是点对点的,每个点都可以关闭连接。当客户端向您发送请求时HttpListener,将进行 TCP 握手,然后服务器将处理数据并通过写入连接的流来响应客户端。如果您尝试写入已被远程对等方关闭的流,则会发生“指定的网络名称不再可用”的异常。

于 2020-11-30T13:58:38.187 回答
0

到目前为止,我在使用 HttpListener 时只遇到过一次这个特殊的异常。当我的应用程序在断点上停留了一段时间后,当我恢复执行时发生了这种情况。

也许涉及某种内部超时?您的应用程序以突发方式发送数据,这意味着它可能在很多时候完全处于非活动状态。异常是否在一段时间不活动后立即发生?

于 2009-06-05T07:36:43.540 回答
0

这里有同样的问题,但其他线程建议忽略异常。

HttpListener 的 C# 问题

可能这不是正确的做法。

于 2011-11-18T07:04:58.937 回答
0

对我来说,我发现每当客户端在完全加载之前关闭网页时,都会给我这个异常。我所做的只是添加一个 try catch 块并在发生异常时打印一些东西。换句话说,我只是忽略了异常。

于 2020-07-27T10:53:09.317 回答