我已经实现了与this类似的功能 唯一真正的区别是
string filename = context.Request.RawUrl.Replace("/", "\\").Remove(0,1);
string path = Uri.UnescapeDataString(Path.Combine(_baseFolder, filename));
这样我就可以遍历子目录了。这适用于网页和其他文本文件类型,但在尝试提供媒体内容时,我得到了异常
HttpListenerException:I / O. 因为操作已经中止 线程退出或应用程序 请求
其次是
InvalidOperationException:在写入所有字节之前无法关闭流。
在使用声明中。
有关如何处理此问题或停止这些例外的任何建议?
由于
答案 0 :(得分:1)
我应该提一下,我在浏览器中使用谷歌浏览器(谷歌浏览器似乎并不关心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);
}
答案 1 :(得分:0)
尝试:
using (Stream s = context.Response.OutputStream)
{
s.Write(msg, 0, msg.Length);
s.Flush()
}