C#:HttpListener服务内容时出错

本文关键字:出错 服务内容 HttpListener | 更新日期: 2023-09-27 18:00:57

我已经实现了类似的东西唯一真正的区别是

string filename = context.Request.RawUrl.Replace("/", "''").Remove(0,1);
string path = Uri.UnescapeDataString(Path.Combine(_baseFolder, filename));

这样我就可以遍历到子目录。这对网页和其他文本文件类型非常有效,但当尝试提供媒体内容时,我会得到异常

HttpListenerException:I/O操作已中止,原因是线程出口或应用程序请求

紧随其后的是

InvalidOperationException:在写入所有字节之前,无法关闭流。

在using语句中。

关于如何处理或阻止这些异常,有什么建议吗?

感谢

C#:HttpListener服务内容时出错

我应该提到,我的浏览器使用的是谷歌浏览器(谷歌浏览器似乎不关心MIME类型,当它看到音频时,它会尝试像在HTML5播放器中一样使用它(,但如果你试图在页面中托管媒体内容,这也适用。

无论如何,我用fiddler检查了我的头,注意到Chrome向服务器传递了3个请求。我开始玩其他浏览器,注意到他们没有这样做,但根据浏览器和我硬编码为MIME类型的内容,我要么会得到一页疯狂的文本,要么下载文件。

在进一步的检查中,我注意到chrome会首先请求该文件。然后用几个不同的头再次请求文件,最明显的是范围头。第一个字节为0,下一个大小不同,具体取决于文件的大小(根据文件的大小,可以发出3个以上的请求(。

所以问题来了。Chrome将首先询问该文件。一旦看到这种类型,它就会发送另一个请求,在我看来,这个请求是在寻找文件的大小(字节=0-(,然后又发送一个请求来请求文件的后半部分或类似的内容,以允许在使用HTML5时体验到某种流式传输。我快速编码了一些东西来处理MIME类型,并将HTML5页面与音频组件一起抛出,发现其他浏览器也可以这样做(除了IE(

所以这里有一个快速的解决方案,我不再得到这些错误

string range = context.Request.Headers["Range"];
int rangeBegin = 0;
int rangeEnd = msg.Length;
if (range != null)
{
    string[] byteRange = range.Replace("bytes=", "").Split('-');
    Int32.TryParse(byteRange[0], out rangeBegin);
    if (byteRange.Length > 1 && !string.IsNullOrEmpty(byteRange[1]))
    {
       Int32.TryParse(byteRange[1], out rangeEnd);
    }
}
context.Response.ContentLength64 = rangeEnd - rangeBegin;
using (Stream s = context.Response.OutputStream)
{
    s.Write(msg, rangeBegin, rangeEnd - rangeBegin);
}

尝试:

using (Stream s = context.Response.OutputStream)
{
      s.Write(msg, 0, msg.Length);
      s.Flush()             
}