2011-04-29 2 views
1

WCF REST 웹 서비스를 제공하는 Windows 서비스 응용 프로그램을 작성했습니다. 그것이를 얻을 수 있도록 호출 클라이언트에 기본이되는 스트림은, 차단,() 반환AdapterStream은 WCF 서비스에서 제대로 플러시되지 않습니까?

public Stream Render(Stream input) 
{ 
    return new AdapterStream(output => DoActualWork(input, output)); 
} 

을하지만 때 즉시 렌더링 :

[OperationContract] 
[WebInvoke(
    Method = "POST", 
    UriTemplate = "/render", 
    BodyStyle = WebMessageBodyStyle.Bare)] 
Stream Render(Stream input); 

과 같이 구현있어 다음과 같이 호출 서명은 HTTP 200 OK 및 0 바이트의 본문 데이터 그 직후에 DoActualWork() 내부의 중단 점이 발생합니다. 서버가 실제로 작업을 수행하고 다음 초 동안 AdapterStream으로 데이터를 덤프하지만 그때까지는 호출자의 연결이 끊어지고 오래 지났습니다.

왜 그런가? DoActualWork()가 실제로 호출 되었기 때문에 프레임 워크가 실제로 AdapterStream에서 데이터를 가져 오려고했으나 너무 늦었거나 무언가 보였을 것입니다.

그 밖의 것이 없다면 동일한 결과 (예 : 결과 스트림이 메서드 매개 변수가 아닌 반환 값이라는 사실을 회피)와 같은 다른 제안 사항이 있습니까? 예 : 거대한 결과를 MemoryStream 먼저 그걸 돌려 주겠다고? 그런데 기억을 많이 먹는 것을 제외하고는 매력처럼 작동합니다.

먼저 당신의 WebHttpBinding이라는이 된 transferMode 스트리밍되었는지 확인 :이 질문은 매우 오래된 경우에도

답변

1

, 나는이 같은 문제를 해결했다. 둘째, 콜백에서 사용자에게 지정된 스트림을 플러시하고 처리해야합니다. 스트림에 대한 쓰기가 끝날 때까지 세 번째로 콜백을 차단합니다 (Render 메서드가 아닙니다!).

관련 문제