gpt4 book ai didi

c# - HttpContext.Response基础套接字意外关闭

转载 作者:太空狗 更新时间:2023-10-29 22:01:57 24 4
gpt4 key购买 nike

我有一个HttpListener,它监听指定端口上localhost(即192.168.0.10/Foobar.ext)上的任何文件请求(在这种情况下,这是使用.m3u8头文件和.ts视频文件的HLS流。系统应适用于任何类型的文件)。

IAsyncResult result = listener.BeginGetContext(new AsyncCallback(HttpRequestListenerCallback), listener);
result.AsyncWaitHandle.WaitOne(1);

发出请求后,回调将为所请求的文件(仅该文件)创建一个 HttpListenerContext,并提取文件名,如下所示:
HttpListenerContext context = listener.EndGetContext(result);
string fileName = context.Request.Url.AbsolutePath.Substring(1);

上下文被添加到名为 httpContexts的字典中,并链接到int commandSequenceNumber以跟踪请求。

如果文件名有效,则将请求发送到服务器以下载文件。下载该文件并将其放入一个名为 totalBufferdata的字节数组中。到这里为止,一切工作正常。

现在,我想将请求的(视频)文件的字节数据写回到请求该文件的上下文的响应( HttpListenerContext.Response)

为此,我使用下面的代码(在文件完全下载后发生 ):
HttpListenerResponse response = httpContexts[commandSequenceNumber].Response; //Get the appropriate context from the dictionary
response.ContentLength64 = totalBufferdata.Count;//set the length response body
Stream responseStream = response.OutputStream; //The stream to which the repsonse needs to be written
try
{
currentContext.Response.OutputStream.Write(dataNoResponseHeader, 0, dataNoResponseHeader.Length);
}
catch (IOException e)
{
Debug.LogError("Exception in writing to response::" + e);
Debug.LogError("innerException:: " + e.InnerException);
}
currentContext.Close();//close the request and response stream

这会将响应通过请求的上下文发送回(即,通过同一端口的192.168.0.10/Foobar.ext)。

现在,只要有快速,可靠的互联网连接,它就可以正常工作。当互联网连接缓慢或不一致时,我开始收到异常消息:
System.IO.IOException: Unable to write data to the transport connection: The socket has been shut down. ---> System.Net.Sockets.SocketException: The socket has been shut down
内部的异常(exception)是:
System.Net.Sockets.SocketException (0x80004005): The socket has been shut down
我已经查询了0x80004005的HResult关联到on msdn的原因,但这仅仅是“E_FAIL未指定的失败”,所以没有运气。

我一直无法弄清楚为什么它会导致套接字关闭的期望(以及为什么它发生在本地主机部分,但仅当连接性不好时)。我确保所有需要的数据都在totalBufferData中,因此低互联网速度不会对此造成影响,因为在我将所有数据写入响应之前已经下载了所有数据。我确保我也不会在代码中的任何地方过早关闭上下文。

到目前为止,我一直没有找到通往HttpListener的底层套接字的方法。我还尝试将response.OutputStream强制转换为NetworkStream,并从NetworkStream获取套接字,但是该强制转换无效(这使我感到困惑,因为它们都是IO流?)。认为这可能是我也尝试过的结局问题
using(Stream testStream = response.OutputStream)
{
testStream.Write(totalBufferdata.ToArray(), 0, totalBufferdata.Count);
}

我觉得这个问题与某个地方的超时有关。但是,监听器不会达到默认的超时时间。根据to MSDN,所有默认超时应为2分钟。到那我无处可去。而且我认为在超时情况下返回的异常应该是ObjectDisposedException Write(Byte[], Int32, Int32) was called after the stream was closed.,因为我想超时会处理连接,而不是崩溃呢?那是误会吗?

请求和响应在单独的线程上完成。但是,在响应仍在进行时完成的请求会排队,并等待响应完成,然后再开始新的响应。

有没有一种方法可以获取和调试底层套接字,以找出其关闭/崩溃的原因?或者是通过本地主机请求文件并响应此不使用HttpListener的替代方法?

一些其他信息:适用于使用脚本运行时版本.Net 4.x等效,.Net 4.x API兼容级别和IL2CPP脚本后端的Unity应用程序(Unity 2019.1)。但是,处理请求或响应的两个类都不是从monobevahiour继承的(这在统一线程上甚至是不可能的)。为Android构建。

赏金事件已经结束,但是只要有一些宝贵的信息,我都会打开一个新的fpr!

最佳答案

关于c# - HttpContext.Response基础套接字意外关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54214788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com