Httplistener 中的“指定的网络名称不再可用”

Posted

技术标签:

【中文标题】Httplistener 中的“指定的网络名称不再可用”【英文标题】:"Specified network name is no longer available" in Httplistener 【发布时间】:2010-09-30 13:49:07 【问题描述】:

我已经构建了一个简单的 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。客户端偶尔会突发发送/接收数据,多次交换会一个接一个地发生。

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

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

【问题讨论】:

您有任何可以发布的代码吗?显示错误的精简内容将非常有帮助。 添加了更多细节,奥斯汀。 不,还没有解决方案,@CraftyFella。 【参考方案1】:

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

【讨论】:

十年后的新想法?你知道System.Net.HttpListenerException: Specified network name is no longer available的内在原因是什么吗? @VitalyZdanevich 我永远无法将其归因于用户实际遇到的问题。将它作为运行 HttpListener 的 Windows 服务吞下的应用程序吞下了它 7 年,没有发生任何事故,然后我将它重新托管在传统的 ASP.NET Web 应用程序中,以便我可以将其移动到 Azure 我也收到了。似乎只在返回 http 500 时发生【参考方案2】:

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

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

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


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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

C# problem with HttpListener

这可能不是正确的做法。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于Httplistener 中的“指定的网络名称不再可用”的主要内容,如果未能解决你的问题,请参考以下文章

在advapi32.dll DLL导入中使用LogonUser()时出现“指定的网络名称不再可用”错误

如何在 C# 中的随机端口上创建 HttpListener 类?

如何防止 HttpListener 在停止时中止挂起的请求? HttpListener.Stop 不起作用

替代 HttpListener?

使用 HttpListener 访问键/值对

使用 C# HttpListener 处理多个请求