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); }
尝试:
上述就是C#学习教程:C#:HttpListener错误服务内容分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
using (Stream s = context.Response.OutputStream) { s.Write(msg, 0, msg.Length); s.Flush() }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/953906.html