C#:HttpListener 提供内容时出错

2023-12-07

我已经实现了类似的东西this唯一真正的区别是

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

这样我就可以遍历子目录。这对于网页和其他文本文件类型非常有用,但是当尝试提供媒体内容时,我遇到了例外

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

其次是

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

在使用语句中。

关于如何处理或停止这些异常有什么建议吗?

Thanks


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

不管怎样,我用 fiddler 检查了我的 headers,并注意到 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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:HttpListener 提供内容时出错 的相关文章

随机推荐

  • OpenCV中如何计算凸性缺陷?

    OpenCV函数使用的算法是什么convexityDefects 计算轮廓的凸度缺陷 请描述并说明该算法的高级操作及其输入和输出 基于文档 输入是两个坐标列表 contour定义原始轮廓 下图中的红色 convexhull定义与该轮廓相对应
  • 将 Android 搜索栏与拇指对齐

    我试图将搜索栏与视图顶部对齐 但无法用拇指将其居中 是否有某种带有RelativeLayout 子项的 alignCenter 这是我的 xml 代码示例
  • 由于 SunCertPathBuilderException:找不到证书,无法在 Eclipse 中连接到 GitHub

    我已经使用 Eclipse EE Luna 设置了我的 mac 一切似乎都工作正常 来自 Windows 我安装了 EGit 和 Github Mylin 插件 但是 我似乎无法在 Eclipse 中克隆 github 项目 当通过 EGi
  • 在Java Maven项目中通过Spark查询Cassandra中的数据

    我正在尝试编写一个简单的代码 在其中创建一个架构 插入一些表 然后提取一些信息并将其打印出来 但是 我收到错误 我正在使用 Datastax cassandra Spark 连接器 我一直在使用这两个例子来帮助我尝试实现这一目标 https
  • 根据变量范围过滤数据透视表

    我的目标是使用另一张工作表中的范围来过滤数据透视表 该范围从第三张表中提取数据 这是启动大量公式并在每次使用时发生变化的数据转储 我有下面的代码 但我可以看到它所做的是运行每个数据透视表字段 将其与范围进行比较 然后删除过滤器 我有 32
  • 如何使用固定点旋转 UIIMageVIew?

    我想按角度旋转图像 但是我想用固定点旋转图像 如何设置这个固定点 设置视图图层的锚点 该锚点位于视图局部坐标中 范围为 0 到 1 即左上角为 0 0 右下角为 1 1 例如 默认是绕中心旋转 imageView layer anchorP
  • 错误:运行 docker 容器时无法访问 jarfile

    尝试运行 docker 容器时出现以下错误 Error Unable to access jarfile 我的 Dockerfile 是这样的 FROM ubuntu 16 04 Install Updates RUN apt get up
  • 如何缓存 IQueryable 对象?

    我有这个方法 它返回 UserStatus 表中所有行的 Linq to SQL 查询 public IQueryable
  • 确定 ABAP 中的活动格式设置

    As the 格式化设置的ABAP文档解释 格式设置设置如下 在内部会议开始时 他们是由相关默认设置决定当前用户的用户主记录中的固定值 使用语句 SET COUNTRY 这是当前内部会话的默认设置可以使用特定于国家 地区的格式进行覆盖 但作
  • R - 当我绘制 xts 和 Zoo 对象时如何更改日期格式?

    我想知道如何更改日期格式 我正在处理的代码如下 library quantmod getSymbols AAPL price AAPL lt AAPL 6 plot price AAPL main The price of AAPL 这个结
  • 接收者未注册

    我有一个带有异步任务的程序和一个广播接收器来发送结果代码 以便 Asynctask 知道应用程序正在工作 但它崩溃了 说接收者在主要活动中未注册 我在主活动中注册了一个接收器 另一个接收器在 AsyncTask 活动中注册 所以这里是代码和
  • 从链接 Google Map API 中提取坐标

    有没有办法使用这种类型的谷歌地图链接检索纬度和经度 https goo gl maps 7jNqZtPa5Cjf333k7 在这个网址中7jNqZtPa5Cjf333k7不是指地点ID吗 我真的很难使用这种类型的链接来提取纬度和经度 如果有
  • 自 2022 年 10 月 VS-Code 更新(版本 1.73)起安装的新 isort 扩展出现问题

    我在 Windows 10 Pro Build 10 0 19045 上使用 VS Code 版本 1 73 1 带有 MS Python 扩展 v2022 18 2 安装 VS Code 2022 年 10 月更新后 在编写 Python
  • 将多行字符串中的指定列转换为单个逗号分隔行

    假设我有以下字符串 something1 12 0 some unnecessary trailing data this must go something2 15 5 some more unnecessary trailing dat
  • 导出带有资源的 jar

    我正在尝试通过构建许多小型模块化项目来构建大型 Java 项目 我希望每个小项目都是完全独立的 拥有其所有资源 例如图像 我正在使用 Eclipse 如果我配置构建路径来添加模块化项目之一 资源引用将不起作用 该系统找不到指定的文件 如果我
  • 如何让 Git 不列出修改过的更改?

    Git status 会给我已更改的文件列表 其中我有一些已更改但我不想提交 只需将其保留在工作目录中即可 令人烦恼的是 在提交之前 如果有新的更改 我必须扫描这些文件的差异 或者这些修改只是我知道的并且不想提交的修改 有没有办法告诉 Gi
  • JavaScript 读取文件内容

    如果您有新文档的 url 如何使用 javascript 从不是您所在页面的文档中检索数据 我想做的是创建一个页面 其中有一个用于提供本地文件名的文本字段和一个从所提供的文档中检索单词的按钮 thanks HTML5 有一个文件 API 可
  • 从资源中排除属性文件

    如何从 src main resources 中排除文件 例如 我在那里有一个名为 map 的文件夹 我想保留它 并且我想删除 war 中的所有内容 或者不首先将其打包到里面 或者替代但结果相同 从 src main resources 中
  • asp.net web 配置错误

    我的 ASP NET 项目仍然有问题 在 Visual Studio 中 当我开始调试时 一切正常并且页面正常工作 但是 当我在 iis7 上尝试时 会显示此错误 显示错误 配置错误描述 处理服务此请求所需的配置文件期间发生错误 请查看下面
  • C#:HttpListener 提供内容时出错

    我已经实现了类似的东西this唯一真正的区别是 string filename context Request RawUrl Replace Remove 0 1 string path Uri UnescapeDataString Pat