지난 주에 조사한 문제로 해결 방법을 찾지 못했습니다. 동일한 질문을하지만 답변을 얻지 못한 게시물을 찾았습니다. 다른 사람들에게도 도움이되기를 바랍니다.스트림을 종료하지 않고 WCF 서비스에서 중단하는 방법은 무엇입니까?
WCF
서비스 내에 stream
이 포함 된 개체를 반환하는 서비스가 있습니다. 나는 basicHttpBinding
을 사용하여 스트리밍 전송 및 Mtom을 클라이언트에 전송합니다.
클라이언트는 WCF
서비스를 호출하고 응답 개체를받은 직후 프록시를 닫습니다.
다음으로 클라이언트는 WCF 서비스에서 가져온 스트림을 읽고 로컬 디스크의 파일에 기록합니다. 이 모든 것은 잘 작동합니다.
제 문제는 클라이언트가 작업을 중단하고 WCF 서비스에서 데이터 다운로드를 중단하려는 경우입니다. 스트림에서 .close()
을 호출하면 (예 : serverReply.DataStream.Close();
) WCF 서비스에서 스트림이 끝날 때까지 전체 스트림을 차단하고 읽습니다. 스트림이 상당히 클 수 있으며 네트워크가 항상 빠르지는 않습니다.
이것은 네트워크 리소스 사용에 대해 매우 바람직하지 않습니다.이 리소스는 더 이상 사용하지 않는 데이터에 기본적으로 낭비됩니다. basicHttpBinding
은 WCF 서비스 서버에 두 개의 동시 TCP 연결 만 허용하므로 기본적으로 스트림이 끝날 때까지 다른 연결 시도를 차단합니다.
동시 연결 수를 늘릴 수는 있지만 문제 해결을위한 여지가 있기 때문에 문제가 될 수 있습니다.
예를 들어, 20 개의 다운로드가 중단되어 데이터를 다운로드하는 중입니다. 송금을 완전히 중지해야합니다.
클라이언트에서 스트림 개체는 보통 Stream
클래스이므로, 닫기 메서드 만 있고 다른 것은 없습니다.
프록시 개체에 .close()
또는 .abort()
을 호출해도 도움이되지 않으며 .dispose()
또는 다른 방법을 사용하여 프록시를 파괴하지도 않습니다. 서버 쪽에서는 OperationContext.OperationCompleted
이벤트를 처리하지만 stream
의 데이터가 끝까지 읽힐 때까지는 발생하지 않습니다.
그렇다면 완전히 스트림을 닫지 않고 스트림을 닫거나 중단하려면 어떻게해야합니까?
행운이 있나요? – Schultz9999
정말 큰 파일을 보내는 동안 같은 문제가 발생했습니다 ... 정말 분명한 것을 놓치고있는 것처럼 보입니다. 해결 방법으로 청킹을 구현해야 할 것입니다. –