C#:HttpListener错误服务内容

我已经实现了类似的东西,只有真正的区别是

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

这样我就可以遍历子目录了。 这适用于网页和其他文本文件类型,但在尝试提供媒体内容时,我得到了例外

HttpListenerException:由于线程退出或应用程序请求,I / O操作已中止

其次是

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

在using语句中。

有关如何处理或停止这些例外的任何建议?

谢谢

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

无论如何,我正在用提琴手检查我的标题,并注意到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() }