WCF는 데이터 전송에 도움이 될 수 있습니다. 하지만 대용량 데이터 전송이 필요한 사람이 있나요? 올바른 설정만 있으면 WCF는 빅 데이터를 전송할 수 있습니다.
클라이언트에서 WCF 서버로 대용량 데이터(>65535B)를 전송할 때 서버에 Service의 실제 로직을 입력하지 않고 프로그램이 Reference의 BeginInvoke에서 EndInvoke로 직접 점프하는 것으로 나타났습니다. 데이터 한도 초과로 인해 발생하는 것으로 의심됩니다.
문제는 제가 실제로 보낸 데이터가 WCF 서버에서 방금 받은 데이터라는 점입니다. 들어오고 나가는 데이터의 양에는 큰 차이가 없습니다.
그러다가 클라이언트와 서버가 실제로 다른 구성을 사용한다는 것을 발견했습니다. 클라이언트의 경우 WCF 전송을 구현하기 위해 ServiceReference를 추가할 때 자동으로 생성되는 ServiceReferences.ClientConfig 파일의 system.serviceModel 섹션에 이러한 설정이 있습니다. 빅 데이터:
47">
; /basicHttpBinding>
클라이언트 섹션에서 구성을 적용합니다.
< /Service/WcfService.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_WcfService"
contract="WcfServiceReference.WcfService"
name="BasicHttpBinding_WcfService" />< /client>
캐시된 최대 바이트 수와 최대 허용 바이트 수는 Binding에 지정되어 있으며 이는 2G 크기에 해당합니다! TV 시리즈 전체가 전송되지 않는 한 일반적으로 충분합니다.
서버 측 Web.config 파일에서 Bindings 섹션이 비어 있고 서비스가 바인딩 구성 속성을 지정하지 않으므로 기본 크기인 65535를 사용합니다.
문제가 발견되었으며 WCF가 빅 데이터를 전송하는 문제를 해결하는 것이 더 쉽습니다.
바인딩 섹션에 새 바인딩 설정을 추가하고 허용되는 최대 데이터를 지정합니다.
< 바인딩>
< basicHttpBinding>
< 바인딩 이름="LargeDataTransferServicesBinding"
maxReceivedMessageSize="2147483647"
messageEncoding="Text" transferMode="Streamed"
"00:10:00" /> 🎜>name="Server.Service.WcfService">
< 엔드포인트 주소="" 바인딩=
"basicHttpBinding" 바인딩Configuration=
"LargeDataTransferServicesBinding"
contract="Server.Service.WcfService" />
< 엔드포인트 주소="mex" 바인딩=
"mexHttpBinding" contract="IMetadataExchange" /> >이 방법을 사용하면 클라이언트 빅 데이터에서 충분한 데이터를 보낼 수 있습니다.
P.S.:
.net은 기본적으로 4M 파일만 전송할 수 있으므로 Wcf의 양쪽 끝 구성이 설정되어 있어도 여전히 .net의 한도를 초과할 수 없으므로 대용량 파일을 전송하려면
< httpRuntimemaxRequestLength="102400" />
여기서 단위는 System.Web 섹션에 KB이므로 100M 파일을 전송할 수 있습니다. WCF 전송 문제 데이터 문제를 완전히 해결합니다. 물론 이렇게 큰 파일의 경우 세그먼트로 전송하는 것이 가장 좋습니다.
.net은 기본적으로 4M 파일만 전송할 수 있으므로 Wcf의 양쪽 끝 구성이 설정되어 있어도 여전히 .net의 한도를 초과할 수 없으므로 대용량 파일을 전송하려면 다음이 필요합니다. System.Web 섹션에서 설정하려면
< httpRuntimemaxRequestLength="102400" />
여기서 단위는 KB이므로 100M 파일을 전송할 수 있으므로 WCF의 문제가 완전히 해결됩니다. 빅데이터를 전송합니다. 물론 이렇게 큰 파일의 경우 세그먼트로 전송하는 것이 가장 좋습니다.
너무 큰 데이터를 전송하면 네트워크 혼잡이 발생할 수 있으므로 전송하지 않는 것이 좋습니다.