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

 加乘ACCA财务英语教室_438 发布于 2023-01-15 16:17

我有一个restful(webHttpBinding)自托管WCF服务.大多数方法都将xml或json版本的对象返回给客户端.

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

我试过AnonymousPipeServerStream: WCF和流请求和响应

以及第一个设置:

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

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

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

将chrome输出到输出的修复显然是在发送分块响应之前给内容写了一些垃圾:Chunked transfer encoding - 浏览器行为,但是,我不认为这对于WCF是可能的.

那么,我正在寻找可能的解决方案:

一种在自托管服务(无IIS)中写入WCF中的输出流的方法.要么

一种控制流响应中的块大小的方法(以及首先编写一些内容以便Chrome将呈现块的方式).

我认为另一种选择是抛弃WCF,支持更友好的REST(我开始认为WCF不是正确的选择).但是,现在在WCF中写了这么多,这似乎是一项繁琐的工作.除非有一些我可以切换到的东西,这将是一个简单的迁移(例如,如果我可以重用相同的服务类,可能只有不同的属性).南希也许?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有