2012-08-10 4 views
1

스트리밍 된 WCF 서비스가 있습니다. 한 번의 조작으로, 업로드 목적으로 파일을받습니다. 나는이WCF 스트림/메시지 크기

request.FileContent.Length 

처럼 뭔가를하려고하면 그리고 나는 OperationNotSupported 예외가 발생합니다. 괜찮아. 하지만 파일 크기를 실제로 옮기지 않고 어떻게 얻을 수 있습니까? 헤더와 같이이 정보를 통화와 함께 보낼 수 있지만이 방법을 사용하고 싶지 않습니다.

WCF가 maxReceiveMessageSize를 통해 요청 크기를 제한 할 수있는 경우. 동일한 정보를 사용하여 메시지/스트림 크기를 확인하려면 어떻게해야합니까?

답변

1

일반적으로 전체 스트림에서 몇 바이트가 있는지를 알려주는 스트림 시작 부분에 데이터가 없으면 바이트 스트림을 모두 읽지 않고 바이트 수를 계산하지 않고 바이트 스트림의 크기를 알 수 없습니다. 또는 WCF 메시지 헤더에서와 같이 스트림의 길이를 전달하는 다른 대역 외 (out-of-band) 방식을 사용합니다. 스트림을 읽지 않고 크기를 알고 싶다면 헤더 접근 방식을 따라야합니다.

WCF maxReceiveMessageSize는 수신 된 바이트 수를 계산하고 한계를 초과하면 예외를 throw하여 작동합니다. 스트림 길이도 알지 못하며 수신 메시지가 선제 적으로 차단되지 않습니다 먼저 허용되는 최대 바이트 수를 읽지 않아도됩니다.

1

하지만 어떻게 파일 크기를 실제로 전송하지 않고도 얻을 수 있습니까? 나는이 정보를 헤더와 같이 호출과 함께 보낼 수 있지만이 방법을 사용하고 싶지 않습니다.

먼저 파이프 아래로 바이트 스트림의 크기를 보내야합니다. 다른 방법은 없습니다. 그것은 스트림에 씁니다 많은 복잡성을 추가하지 않습니다

(일부 붙박이 방법은 어쨌든 일을 할 수있는 모든 그게 전부가 있다면) :

var bytes = File.ReadAllBytes("somefile.txt"); 
stream.Write(BitConverter.GetBytes((Int32)bytes.Length), 0, 4); 
stream.Write(bytes, 0, bytes.Length); 

및 다음 다른 쪽의 스트림을 읽을 때 :

이 단지 예를입니다
byte[] fileLengthBytes =new byte[4]; 
stream.Read(fileLengthBytes, 0, 4); 
int length = BitConverter.ToInt32(fileLengthBytes, 0); 
//you know the size of the file now, log it or show the user 
var fileBytes = new byte[length]; 
stream.Read(fileBytes, 0, fileBytes.Length); 

- 스트림이 큰 경우 당신이 byte[] 버퍼를 생성 할 수 없습니다.