C#:HttpListener错误服务内容

时间:2011-07-01 14:22:33

标签: c# http exception httplistener

我已经实现了与this类似的功能 唯一真正的区别是

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

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

  

HttpListenerException:I / O.   因为操作已经中止   线程退出或应用程序   请求

其次是

  

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

在使用声明中。

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

由于

2 个答案:

答案 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()             
}