2014-07-08 2 views
2

클라이언트에서 WCF net.tcp 서비스로 큰 xml을 보내는 데 문제가 있습니다. 메서드를 호출 할 때 특정 컴퓨터의 클라이언트가 메모리 부족 예외를 throw합니다. 내 로컬 컴퓨터에서 재현하십시오. 예외 메시지 : 33554432 바이트의 관리 메모리 버퍼를 할당하지 못했습니다. 사용 가능한 메모리 양이 적을 수 있습니다.WCF NetTcp 서비스 및 스트리밍 트랜스 포머

그래서이 문제를 해결할 방법을 읽을 때 스트리밍이 이어지는 길이되었습니다. 그래서 나는 따라 클라이언트와 서비스 모두에 바인딩 변경 : http://msdn.microsoft.com/en-us/library/ms789010(v=vs.110).aspx

I : 그러나

<netTcpBinding> 
     <binding name="NetTcpBinding_IPricerDataService" closeTimeout="00:10:00" transferMode="Streamed" 
      openTimeout="00:10:00" sendTimeout="00:10:00" maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" /> 
</netTcpBinding> 

, 나는 이것이 스트림 매개 변수를 사용하는 서비스 메소드 서명을 변경 또한 의미하는 인상이었다 이 작업을 수행하지 않았다면 메소드 시그니처는 원래대로 유지했지만 클라이언트는 이전과 마찬가지로 서비스 메소드를 여전히 호출 할 수 있으며 예상대로 작동합니다.

스트리밍 변환 코드가 예상대로 사용되지 않거나 스트리밍을 지원하기 위해 메서드 서명을 변경할 필요가 없다는 의미입니까? 내가 실제로 확인할 수있는 아이디어가 있습니까?

답변

2

메소드 시그니처를 변경하지 않으면 서버 구성에 관계없이 데이터를 엄격하게 스트리밍하지 않고 이전과 똑같이 전송합니다.

  • 데이터를 보유 매개 변수 이 방법의 유일한 매개 변수 여야합니다 스트리밍 할 : MSDN 설명서로서 당신은 상태를 연결. 예를 들어 입력 메시지가 스트리밍되는 메시지 인 경우 작업에는 정확히 하나의 입력 매개 변수가 있어야합니다. 마찬가지로 출력 메시지가 스트리밍되는 경우 작업에는 정확히 하나의 출력 매개 변수 또는 반환 값이 있어야합니다. 매개 변수반환 값의 종류
  • 적어도 하나는 스트림, 메시지, 또는 IXmlSerializable이어야합니다.

이것은 당신의 상류 방법을 위해, 당신은 당신이 스트림을 보내는, 그리고 다운 스트림 방법에 대해 당신이로 Stream를 지정하는 데이터를 나타내는 매개 변수로 Stream를 지정 것이라고 의미 반환 유형 : 읽을 데이터가 들어 있습니다.

는 다음 ServiceContract에서 설명된다

[OperationContract] 
Stream GetStream(string data); 
[OperationContract] 
bool UploadStream(Stream stream); 
[OperationContract] 

위의 입증 된 바와 같이 당신이 당신의 방법을 지정하지 않은 클라이언트와 서비스간에 데이터를 스트리밍 결국하지 않을 경우 - 사용됩니다 서버 설정을 변경하기 전과 똑같은 방법. 또한 구성에서 스트리밍을 사용하도록 지정했지만 방법을 변경하지 않았더라도 사용자의 방법이 여전히 작동하는 이유이기도합니다.

이러한 메서드를 MSDN 문서에 나와있는 기준에 맞게 변경하면 데이터를 올바르게 스트리밍해야합니다. 클라이언트와 서버가 바뀌어 전체 업/다운 스트림을 고려해야합니다.보조 노트에

, 당신의 예외 메시지 :

예외 메시지 : 33,554,432 바이트의 관리되는 메모리 버퍼를 할당하지 못했습니다. 사용 가능한 메모리 양이 적을 수 있습니다.

시스템에서 데이터가 들어있는 기본 버퍼에 32MB의 데이터를 할당 할 수 없음을 나타냅니다. 스트리밍을 올바르게 구현하더라도이 문제는 계속 발생할 수 있습니다. 정상적인 상황에서는 32MB 버퍼가 문제가되지 않아야합니다.

+0

@DanielKelley 질문에 어떻게 대답하지 않습니까? '스트리밍 트랜스 폼 모드가 예상대로 사용되지 않거나 스트리밍을 지원하기 위해 메소드 서명을 변경할 필요가없는 것입니까? ', 할당되지 않은 버퍼에 대한 몇 가지 소문이 있습니다. – aevitas

+0

@DanielKelley 감사합니다. 답변을 편집하여 "예,해야합니다."라고 간단히 말합니다. 그게 당신이 쫓고있는 것 같아요. 당신이 질문에 대답하지 않는다고 느끼면 다운 다운하라. – aevitas

+0

@DanielKelley 고마워, 나는 내 대답을 정교하게 만들었다. – aevitas

관련 문제