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语句中。
关于如何处理或阻止这些异常,有什么建议吗?
感谢
我应该提到,我的浏览器使用的是谷歌浏览器(谷歌浏览器似乎不关心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()
}