我有一个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中写了这么多,这似乎是一项繁琐的工作.除非有一些我可以切换到的东西,这将是一个简单的迁移(例如,如果我可以重用相同的服务类,可能只有不同的属性).南希也许?