2011-04-29 28 views
1

我写了一个公开WCF REST Web服务的Windows服务应用程序。呼叫签名如下:AdapterStream从不在WCF服务中正确刷新?

[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)); 
} 

但马上,当渲染()返回时,底层流调用客户端被切断,从而得到一个HTTP 200 OK和0字节的正文数据。紧接着,DoActualWork()内部的断点被击中 - 所以服务器实际上完成了它的工作,并在接下来的几秒内将数据转储到AdapterStream中,但是到那时,调用者已经断开并且很久没有离开。

任何想法,为什么会发生这种情况?由于DoActualWork()实际上被调用,所以框架似乎确实试图从AdapterStream中获取数据,但是......太迟了,或者什么都没有。

如果没有别的,你是否有任何其他的建议来实现相同的事情(即绕过结果流是返回值而不是方法参数),而不必将(巨大)结果转储到MemoryStream中首先并返回?顺便说一句,除了吃大量的记忆之外,它就像一种魅力。

回答

1

即使这个问题是很老,我解决了这样的问题:

首先确保您的WebHttpBinding已经TransferMode流。 其次确保您刷新并处理在回调中给予您的流。 第三次阻塞回调(不是Render方法!)直到完成写入流。