我有一个宁静的(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(使用前将#替换为@)