我编写了一个公开WCF REST Web服务的Windows服务应用程序。呼叫签名如下:
[OperationContract]
[WebInvoke(
Method = "POST",
UriTemplate = "/render",
BodyStyle = WebMessageBodyStyle.Bare)]
Stream Render(Stream input);
它是这样实现的:
public Stream Render(Stream input)
{
return new AdapterStream(output => DoActualWork(input, output));
}
但是当Render()返回时,立即切断调用客户端的基础流,以便获得HTTP 200 OK和0字节的正文数据。紧接着,DoActualWork()内部的断点被点击 - 所以服务器实际上完成了它的工作并在接下来的几秒钟内将数据转储到AdapterStream上,但到那时调用者已经断开连接并且很久就消失了。
为什么会这样?由于DoActualWork()实际上是被调用的,看起来框架确实试图从AdapterStream中获取数据,但是......太好了,太晚了。
如果没有别的,你是否有任何其他建议来实现相同的事情(即绕过结果流是返回值而不是方法参数的事实),而不必首先将(巨大的)结果转储到MemoryStream中并返回?顺便说一下,除了吃大量的记忆之外,它就像魅力一样。
答案 0 :(得分:1)
即使这个问题很老,我也解决了这个问题:
首先确保您的WebHttpBinding已传输TransferMode。 其次确保您在回调中刷新并处理提供给您的流。 第三个阻止回调(不是Render方法!),直到完成写入流。