2014-05-12 2 views
1

저는 C# mvc 응용 프로그램에서 wcf 서비스를 사용하고 있습니다. 클라이언트 측 (컨트롤러에)에서 대량의 데이터 (약 20000 레코드)를 wcf로 가져와야합니다.많은 양의 데이터를 크로스 도메인에 전달할 수 없습니다.

로컬 버전 - 나는 모든 레코드를 매우 잘 갖지만 서버 버전에서는 쿼리를 1000 레코드로 제한하지 않으면 아무 것도 얻지 못합니다.

System.ServiceModel.CommunicationException을 :

이 제한 모든 기록을 가지고 노력 아니에요

이 내가 클라이언트 로그에 무엇을 얻을 은/WCF를 xxx는하기 위해 HTTP 응답을받는 동안 오류가 발생했습니다 .svc. 이는 HTTP 프로토콜을 사용하지 않는 서비스 엔드 포인트 바인딩에 대한 일 수 있습니다. 이 은 서버에서 HTTP 요청 컨텍스트가 중단 되었기 때문일 수 있습니다 (서비스가 종료되었을 가능성이 있습니다). 자세한 내용은 서버 로그 을 참조하십시오. ---> System.Net.WebException : 기본 연결이 닫혔습니다 : 수신시 예기치 않은 오류가 발생했습니다. ---> System.IO.IOException : 전송에서 데이터를 읽을 수 없습니다. 연결 : 기존 연결이 원격 호스트에 의해 강제로 닫혔습니다. ---> System.Net.Sockets.SocketException : 기존 연결 이 원격 호스트에서 강제로 닫혔습니다. System.Net.Sockets.NetworkStream.Read (Byte [] 버퍼, Int32 오프셋, Int32 크기) --- 내부 예외 스택 추적의 끝 --- 에서 System.Net.Sockets.NetworkStream.Read (Byte [] 버퍼, Int32 오프셋, Int32 크기) at System.Net.PooledStream.Read (Byte [] buffer, Int32 offset) , Int32 크기) 에서 System.Net.Connection.SyncRead (HttpWebRequest 요청, 부울 userRetrievedStream, 부울 probeRead) --- 내부 예외 끝 --- System.Net.HttpWebRequest.GetResponse (at) 에서 끝 시스템 .HttpChannelRequest.WaitForReply (T imeSpan 시간 초과) --- 내부 예외 스택 추적의 끝 ---

나는 클라이언트의 Web.config이를 추가했지만 그것은 도움이되지 않았다 :

<behaviors> 
     <endpointBehaviors> 
     <behavior > 
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

어떤 아이디어?

+0

서버 쪽의 WCF 추적에 오류가 있습니까? –

+0

@Jon_Lindeheim 아니요 – ParPar

+0

왜 페이징을 사용하고 한 번에 1000 개 항목 만 요청합니까? 한번에 모든 것을 가져 오는 것은 틀림없이 나쁜 디자인 선택입니다. 이것은 인터넷이나 기업 LAN을 통해 진행됩니까? 여전히 교차 도메인에 대해 tcp를 사용할 수 있습니다. 자사의 LAN이라면 ** tcpBinding **을 사용해야합니다. J. Lowy, "WCF Services 프로그래밍", 제 3 판 – MickyD

답변

1

큰 데이터를 허용하도록 바인딩 구성을 설정 했습니까? 당신이 httpbinding를 사용하는 경우는 IIS

<security> 
    <requestFiltering> 
     <requestLimits maxAllowedContentLength="4294967295" /> 
    </requestFiltering> 
</security> 
지원 요청에 서버 콘텐츠의 최대 길이를 증가하려고 다음

<basicHttpBinding> 
<binding name="LargeDataBindingConfiguration" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false"> 
<readerQuotas maxDepth="32" maxStringContentLength="998192" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647" /> 
</binding> 
</basicHttpBinding> 

다른 이런 방식으로 엔드 포인트 및 서비스를 구성해야

+0

이것은 좋은 대답이지만, 증상을 숨기고 원인을 수정하지 않음으로써 나쁜 습관을 조장합니다.이 경우에는 페이징을 사용하지 않고 OP의 모든 것을 한꺼번에 가져 오는 것이 좋지 않습니다. . – MickyD

+0

나는 이것을 이미 가지고있다. – ParPar

1

Mackho가 말했듯이 첫 번째 구성 설정에서 시간 초과를 늘려야합니다. 또한 클라이언트는 제한 시간 값과 서버에서 가져올 수있는 최대 내용을 늘려야합니다.

실제로 모든 데이터를 전달해야하고 페이징을 사용하지 않으려는 경우 서비스에 스트리밍을 사용할 수 있습니다.스트림 모드에서 실행되도록 서비스를 구성하려면 추가 클라이언트 설정도 중요하다

<bindings> 
    <basicHttpBinding> 
     <binding transferMode="Streamed" name="LargeDataBindingConfiguration" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="998192" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="2147483647" /> 
     </binding> 
    </basicHttpBinding> 
</bindings> 

참고 :

  • 가장 낮은 제한 시간은
  • (클라이언트 또는 서버에서) 이길 것 maxStringContentLength와 클라이언트가 수신 할 수있는 설정 중 가장 낮은 값이 적용됩니다.
  • 스트리밍을 사용하려면 클라이언트가이를 지원해야하며 설정도 동일해야합니다 (그렇지 않으면 클라이언트에서 데이터가 버퍼 됨)

실제로 예외가 서버 또는 클라이언트에 의해 발생되는지 여부에 따라 다릅니다. 양쪽 모두에서 WCF 추적을 사용하고 예외가 발생하는 곳을 확인한 다음 해당 측면에서 필요한 구성을 수행하십시오.

관련 문제