2012-03-06 7 views
2

배열 크기 제한; 예상 된 응답으로 서비스가 반환됩니다. 어떤 시점에서 전달 된 배열이 너무 커서 (2000 항목에서 보임) 이 던졌습니다. "{"The remote server returned an unexpected response: (400) Bad Request."}"WCF 서비스 - I의 크기가 1,000 이하의 IEnumerable을 전달하는 경우 구성 작품 같은 IEnumerable을</p> <pre><code>[OperationContract] List<Item> GetItems(DateTime sinceDate, IEnumerable<Guid> idList); </code></pre> <p>방법을 전달됩니다 내가 구현 한 WCF 서비스 방법을

배열 크기 제한을 관리하는 것이 확실하지 않습니다. 나는 바인딩의 readerQuotas 섹션을 알고 있고 maxArrayLength는 기본 16384로 설정되어 있습니다. 버퍼 크기는 충분히 크게 설정되어 있지만 서비스 호출이 실패하는 이유를 모르겠습니다. 전달되는 배열 크기에 대한 basicHttpBinding에 제한이 있습니까? 대형 배열을 전달할 수 있도록 구성에서 변경해야하는 사항은 무엇입니까?

여기 내 app.config는 클라이언트 측에 있습니다. 서버 쪽은 동등한 것입니다.

<binding name="BasicHttpBinding_IMyService" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="20000000" maxBufferPoolSize="524288" maxReceivedMessageSize="20000000" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
        realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
</binding> 
+0

모든 데이터를 전송할 수 있도록 제한 시간 옵션을 늘리려고 했습니까? http://msdn.microsoft.com/en-us/library/system.servicemodel.basichttpbinding.aspx – CheGueVerra

+0

maxItemsInObjectGraph 속성을 아래와 같이 설정 했습니까? 또한 readerQuotas의 값을 큰 값으로 설정하십시오. 그들이 클라이언트와 서버 측 모두에서 설정되어 있는지 확인하십시오. – Rajesh

답변

0

당신은 그래프에 최대 개체 항목을 증가 서비스 동작을 등록해야합니다 :

<serviceBehaviors> 
    <behavior name="IncreadedSizeBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="100000"/> 
    </behavior> 
    </serviceBehaviors> 
그런 다음 엔드 포인트에서이 동작을 등록해야

:

<services> 
    <service name="MyService" behaviorConfiguration="IncreadedSizeBehavior"> 
     <host /> 
     <endpoint /> 
</services> 

일을 wcf 문제를 디버깅 할 때 가장 유용한 점은 추적 오류 로깅을 추적하는 것입니다.

<system.diagnostics> 
     <trace autoflush="true" /> 
     <sources> 
      <source name="System.ServiceModel" 
          switchValue="Error" 
          propagateActivity="true"> 
       <listeners> 
        <add name="sdt" 
          type="System.Diagnostics.XmlWriterTraceListener" 
          initializeData= "ErrorTrace.svclog" 
          /> 
       </listeners> 
      </source> 
     </sources> 
    </system.diagnostics> 

그런 다음 추적 파일을 svc 추적 뷰어 downloadable with the windows sdk으로여십시오. 메시지를 처리 ​​할 때 모든 오류와 실제 오류를 잘 볼 수 있습니다.

+0

감사합니다. 로깅을 사용하면 최대 수신 메시지에 문제가 있음을 알리는 오류가 발생합니다. 들어오는 메시지의 최대 메시지 크기 할당량 (65536)이 초과되었습니다. 할당량을 늘리려면 해당 바인딩 요소에서 MaxReceivedMessageSize 속성을 사용합니다. –

+0

샘플을보고 20000000으로 설정하지 않았습니까? –

+1

아, 실제로 클라이언트 측의 예제가 있는데, 서버 측에서도 설정해야한다고 생각합니다. –