如何在不缓冲的情况下从 WCF 流式传输响应?

2024-07-01

我有一个宁静的(webHttpBinding)自托管WCF服务。大多数方法都会向客户端返回 xml 或 json 版本的对象。

我有几个触发长时间运行的方法的 GET 方法,我想将日志响应流式传输到浏览器(或应用程序),以便用户知道发生了什么。这很容易完成HttpContext.Current.Response.OutputStream.Write。很遗憾,HttpContext.Current在自托管 WCF 服务中始终为 null,即使我包含aspNetCompatibilityEnabled配置(不幸的是,IIS 不是一个选项)。

我努力了AnonymousPipeServerStream: WCF 和流式请求和响应 https://stackoverflow.com/questions/2726527/wcf-and-streaming-requests-and-responses

与第一个设置一起:

OutgoingWebResponseContext context = WebOperationContext.Current.OutgoingResponse;
context.ContentType = "text/plain";

这样响应就会进入浏览器,它不会将流下载到文件中保存。

在 Chrome 中它根本不起作用 - 它会缓冲直到结束。在 IE 或 wget 中,它似乎一次缓冲大约 4k(或其他)。这对于日志记录没有好处,因为除非我吐出大量不必要的日志消息来强制输出,否则用户并不真正知道发生了什么。我只能假设这是因为响应实际上是分块响应,并且块为 4k(而不仅仅是写入输出流)。

让 chrome 输出的修复显然是在发送分块响应之前向内容写入一些垃圾:分块传输编码 - 浏览器行为 https://stackoverflow.com/questions/13557900/chunked-transfer-encoding-browser-behavior但是,我认为 WCF 不可能做到这一点。

所以,我正在寻找可能的解决方案:

  • 一种在自托管服务(无 IIS)中写入 WCF 输出流的方法。 或者
  • 一种控制流响应中块大小的方法(以及一种首先写入一些内容以便 Chrome 渲染块的方法)。

我想,另一个选择是放弃 WCF,转而采用更 REST 友好的东西(我开始认为 WCF 不是正确的选择)。然而,现在在 WCF 中写了这么多,这似乎是一项乏味的任务。除非有什么我可以切换到的东西,这将是一个简单的迁移(例如,如果我可以重用相同的服务类,也许只是具有不同的属性)。也许是南希?


我已经做了类似您在这里询问的事情 - 也是自托管的。我编写了一个 WCF (BasicHttpBinding) 服务,该服务将数据流式传输和缓冲到使用我的服务进行数据同步的客户端设备。正如您可能已经发现的那样,流式传输很困难,而且我认为没有任何方法可以“写入流”。

从基本意义上讲,WCF 服务上的流式处理的工作方式与 File.IO 的工作方式相同,如下面的代码所示

 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
 BinaryReader br = new BinaryReader(fs);

如果相关文件为 1 GB,则文件流将在读取到文件末尾之前开始返回字节。 WCF 流式传输的工作方式相同(事实上,根据我的经验,它实现了 FileStream),这就是为什么它适合处理大量数据。它读取……它发送;它读取...它发送。所以我不确定您如何将一些信息注入该流中以输出到屏幕上。

话虽如此,我们的同步 UI 会显示下降的字节数以及完成的百分比,以防止用户关闭计算机或取消。为此,我们让一个单独的线程每 10 秒读取一次下载文件的大小并计算整体的百分比(完整的大小作为响应中的参数发送回来),然后将结果写入 UI 结果窗口。因此,在我们的例子中,解决方案实际上非常简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不缓冲的情况下从 WCF 流式传输响应? 的相关文章

  • 当找到路由/url 但未找到其背后的资源时返回什么?

    当路由customer 1存在但customer搜索背后的资源 实体不存在时 我应该返回 404 吗 我的意思是路线存在 或者我应该返回一个 204 无内容 因为我找不到客户 结果为空 微软样本 public IHttpActionResu
  • 浮点指令异常——FLDZ故障?

    I am trying to debug the problem I posted earlier here C and pin tool very weird DOUBLE variable issue with IF statement
  • 使用 Javascript 隐藏数据网格列?

    我有一个包含大约 20 列的 net 数据网格 我需要使用 JavaScript 通过单击按钮来切换列的可见性 有任何想法吗 您想使用 COLGROUP 来执行此操作 否则您必须应用样式every细胞开启everyrow 这将非常低效 并且
  • 将数据路径数据到树状数据结构

    我有以下数据 root root blue root blue temp root main root main dev root main back root etc init root etc init dev root etc ini
  • 我应该如何继承IDisposable?

    为了保护无辜者 班级名称已更改 如果我有一个名为 ISomeInterface 的接口 我还有继承该接口的类 FirstClass 和 SecondClass FirstClass 使用必须处置的资源 二等舱没有 那么问题来了 我应该从哪里
  • 启动离线 ClickOnce 应用程序并等待退出

    我已经部署了 ClickOnce Windows 窗体应用程序 应用程序 A 另一个应用程序 应用程序 B 以文件名作为参数启动应用程序 A 我用这段代码做到这一点 var basePath Environment GetFolderPat
  • 使用 X509 证书对多个收件人进行 XML 加密和解密

    我已经成功地使用 MSDN 上的示例来加密和解密 xml 文档 http msdn microsoft com en us library ms229744 aspx http msdn microsoft com en us librar
  • 无锁“如果不为零则递减”

    我目前正在用 C 重新发明线程池的轮子 我已经消除了代码中的几乎所有锁 除了以下构造的多个实例之外 std atomic size t counter void produce counter void try consume if cou
  • Json.Net 反序列化 JSON 对象,索引为名称 [重复]

    这个问题在这里已经有答案了 我尝试使用 Json NET 从 Web 服务解析 JSON 该 Web 服务返回以下格式的数据 0 ID 193 Title Title 193 Description Description 193 Orde
  • 在哪里可以查看 LINQ 源代码?

    我需要编写自己版本的 except 方法 或者至少以某种方式修改 LINQ 方法的工作方式 我正在与大型自定义对象列表进行比较 并且需要将匹配项从列表 A 连接到列表 B 我认为除外哈希表构建是进行比较的最快方法 但该方法只会返回非匹配项
  • 如何在类型依赖于派生类的基模板类中声明成员?

    给定一个使用 CRTP 的基类 我正在考虑在基模板类中声明一个成员 其中类型依赖于派生类 虽然以下内容按预期工作 template
  • 在 OpenGL 中绘制 2D 纹理 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个绘图函数叫做DrawImage但这确实令人困惑 并且仅适用于特定形式的重塑函数 所以我有两个问题 如何在 Ope
  • 如何从库调用方法到 C# 控制台

    我在新库中创建了一个方法 这是我的代码 namespace ClassLibrary1 public class Class1 public static bool ISprime int prime if prime lt 2 retur
  • 如何确保 IsInRole 检查不使用缓存的凭据

    我有一个连接到 WCF 服务的 WPF 客户端 我想锁定某些功能 以便只有某些用户可以执行某些操作 WCF 服务在执行服务方法时模拟客户端用户 操作系统是Windows XP 我正在读书这个问题 https stackoverflow co
  • C# 替换 Byte[] 中的字节

    替换字节数组中的某些字节的最佳方法是什么 例如我有bytesFromServer listener Receive ref groupEP 我可以做BitConverter ToString bytesFromServer 将其转换为可读格
  • 将 byte[] 作为文件打开,而不先将其实际保存为文件

    打开以 byte 形式存储在数据库中的 Word 文件的最佳方法是什么 我必须将一些文档存储在 Access 数据库中 Word 文件 2003 及更高版本 并存储在严格通过 CD 运行的应用程序上 不幸的是 它们必须位于数据库中 并且不能
  • 为什么不允许静态常量浮点数? [复制]

    这个问题在这里已经有答案了 我有一个类 它本质上只是保存了我的应用程序中使用的一堆常量定义 但由于某种原因 longs 编译但是float不 class MY CONSTS public static const long LONG CON
  • C:分段错误:GDB:<读取变量时出错>

    我有一个函数shortestPath 它是Dijkstra算法的修改实现 用于我正在为comp2类开发的棋盘游戏AI 我浏览了网站并使用 gdb 和 valgrind 我确切地知道段错误发生的位置 实际上几个小时前就知道了 但无法弄清楚是什
  • 如何使用 gcc 的 -I 命令添加递归文件夹

    有没有办法使用 gcc 的 I 命令并通过给出 a 将所有路径添加到搜索路径root目录 我正在尝试使用 gcc E myfile c查看宏展开式 但是myfile c包含不同目录中的一大堆其他头文件 并且因为我在 vim 中执行此命令 所
  • “System.Int64”类型的表达式不能用于返回类型“System.Object”

    我正在尝试创建以下形式的表达式 e gt e CreationDate CreationDate属于类型long 但是我希望表达式返回一个object反而 我想用object作为返回类型 因为表达式是在运行时根据查询参数动态构建的 查询参数

随机推荐

  • Electron v4 支持 ECMAScript 模块吗?

    我正在使用 Electron 编写应用程序 当前版本 4 0 6 基于 Node 10 11 0 和 Chrome 69 0 3947 106 我认为最新版本的 Electron 将支持 ECMAScript ES6 模块 但到目前为止我还
  • Jenkins 管道脚本未运行

    对于下面的管道脚本 Helo World 未打印 甚至节点也没有被分配 pipeline agent any stages stage Example steps echo Hello World 安装了 Pipeline Declarat
  • 为什么当缩放改变时,具有相同高度的元素“看起来”不同?

    基本上 要点就在主题中 当我创建两个具有固定高度 2px 的相同 div 并将缩放更改为 75 或 125 时 由于某种原因它们 看起来 不同 有人可以解释一下这里发生了什么吗 我该如何解决这个问题 gradient slider line
  • 当我使用 iText 从 PDF 文件中提取文本时,我从前一页获取值

    我正在尝试从多页 PDF 文件中每个页面的特定位置提取文本块 我知道文本的位置 并且能够在第一页上正确提取它 然而 在第一页之后的页面上 提取的文本似乎正在累积 例如 如果第 1 页上的文本值为 A 第 2 页为 B 第 3 页为 C 那么
  • 如何使用 scipy.spatial.Delaunay 查找 delaunay 三角剖分中给定点的所有邻居?

    我一直在寻找这个问题的答案 但找不到任何有用的东西 我正在使用 python 科学计算堆栈 scipy numpy matplotlib 并且我有一组二维点 我为其计算 Delaunay 训练 wiki https en wikipedia
  • Python 中的双 SSH 隧道

    今天 我在命令行中使用 ssh 将端口从远程服务器转发 使用中间服务器到我的本地计算机 这是我在 shell 中使用的命令 ssh user remote server L 2443 localhost 433 此 ssh 会话使用 ssh
  • 如何将组添加到多个内置功能区选项卡 (vsto)?

    这是 VS2010 Office 2010 加载项 我想要的只是添加一个按钮 或按钮组 到多个内置选项卡 例如 我的按钮应该在两个中都可用新邮件消息功能区 and in 新预约丝带 我尝试添加一个新选项卡 在视觉设计器中 但这似乎不起作用
  • 使用本地文件作为

    是否可以使用用户硬盘中的音频文件作为srcHTML5 的属性
  • 未知的 UTF-8 代码单元闭合双引号

    我的问题如下 我正在读取一个 XML 文件 其文本节点部分包含 UTF 8 版本的打开和关闭双引号 文本被提取 缩短为 3999 字节并放入新的 XML 格式 然后保存为文件 虽然 Notepad 在输入文件中正确显示了这两个符号 但输出文
  • d3.js 结合分层边缘捆绑和径向 Reingold–Tilford 树 + 数据

    我想 某种程度上 结合分层边缘捆绑 http bl ocks org mbostock 7607999和径向 Reingold Tilford 树 http bl ocks org mbostock 4063550 It would loo
  • 将函数参数传递给公式

    我试图理解为什么 foo function d y x fit with d lm y x foo myData Y X 不起作用 例如 myData data frame Y rnorm 50 X runif 50 对我来说似乎棘手的一点
  • 如何将嵌套模块与传单地图一起使用

    我正在尝试使用shiny模块来构建一个应用程序leaflet地图 然而 当我运行下面的代码时 地图无法正确渲染 它呈灰色 我希望发生的是user从侧面板中选择城市 并显示地图的相关部分 问题末尾有一个使用标准闪亮来说明的示例 我认为用户输入
  • 如何对 array_chunk 中的元素进行分组

    我在 joomla 中创建模块时遇到问题 我的 php 技能受到限制 我使用 foreach 显示模板文件中的元素 div show information gt gt 我如何使用 array chunk 将 3 个元素分组到一个 div
  • Samsung Galaxy J1 4G 上的 webRTC 应用程序崩溃

    我正在开发视频通话 Android 应用程序 该应用程序可以在 Nexus 4 Moto g2 Moto g3 Moto e 等设备上进行视频通话 但当我在 Samsung Galaxy J1 4G 上拨打电话时 它崩溃了 这是堆栈跟踪 E
  • Python 文件打开并立即关闭

    尝试首先通过 powershell 然后通过 cmd 运行此代码 甚至简单地单击它 我正在输入 start python myfile py 来运行它 在每种情况下 文件都会在屏幕上闪烁并立即关闭 我查看它的唯一方法是将文件直接拖到cmd中
  • 如何反向遍历 C# 集合?

    是否有可能有一个foreach将以相反顺序遍历 Collections 对象的语句 如果不是foreach声明 还有其他方法吗 你可以用普通的for向后循环 如下所示 for int i collection Count 1 i gt 0
  • 如何获取 Tkinter 标签文本?

    我正在制作一个用户将从中选择的地址列表 并且将返回地址文本 我需要使用Tkinter Label因为Tkinter Listbox不允许换行 关键是没有 get Label 类中的类似方法 我知道我可以做类似的事情 v StringVar
  • 在进程之间共享列表的正确方法?

    我想设置两个子流程 其中subprocess1不断生成数据 类型为list and subprocess2负责处理发来的数据subprocess1 I used multiprocessing Manager list 创建共享列表 但这是
  • 如何使用 Sublime Text 2 让rails_footnotes 打开文件?

    我不是问如何告诉脚注如何做到这一点 我在initializers footnotes rb file Footnotes Filter prefix txmt open url file s line d column d 我的问题是应该用
  • 如何在不缓冲的情况下从 WCF 流式传输响应?

    我有一个宁静的 webHttpBinding 自托管WCF服务 大多数方法都会向客户端返回 xml 或 json 版本的对象 我有几个触发长时间运行的方法的 GET 方法 我想将日志响应流式传输到浏览器 或应用程序 以便用户知道发生了什么