2012-02-02 8 views
10

jQuery $ .ajax json POST를 사용하여 내 WCF 웹 서비스를 호출합니다.

입력 매개 변수 중 하나가 8000 바이트를 초과하는 매우 깁니다. 이 데이터는 쉼표로 구분 된 GUID 목록입니다 (예 : "78dace54-1eea-4b31-8a43-dcd01e172d14, ce485e64-e7c6-481c-a424-2624371180aa, ede4c606-f743-4e0a-a8cc-59bcffa7feda, f0a81ed1-80db- 4f6d-92d7-2fc47759a409 ".

이 매개 변수가 8176 바이트이면, 요청은에 성공합니다. (쉼표 및 GUID가 하나임) 인 경우 - 요청이으로 실패합니다.

브라우저 및 피들러 (HTTP 디버깅 프록시)에서 오류가 발생합니다. I는 웹 서비스의 설정이 추가 : 어떤 차이가되지 않습니다JSON 매개 변수 크기 제한

<configuration> 
<system.web.extensions> 
    <scripting> 
     <webServices> 
      <jsonSerialization maxJsonLength="50000000" recursionLimit="50000"/> 
     </webServices> 
    </scripting> 
</system.web.extensions> 

는 요청이 여전히 8176 이상 바이트 입력 PARAM 실패합니다.
입력 매개 변수가 WCF 측의 String으로 매핑됩니다.
내가 무엇이 누락 되었습니까? 고맙습니다! 또한

<bindings> 
    <webHttpBinding> 
    <binding name="Binding_Name" maxReceivedMessageSize="900000"> 
     <readerQuotas maxDepth="32" maxStringContentLength="900000" maxBytesPerRead="900000" maxArrayLength="120000" maxNameTableCharCount="120000"/> 
    </binding> 
    </webHttpBinding> 
</bindings> 

: 이 설정은 개별 매개 변수에 대한 최대 길이를 제어하는 ​​또 다른 설정이 총 JSON 메시지 길이

<webServices> 
    <jsonSerialization maxJsonLength="50000000" recursionLimit="50000"/> 
</webServices> 

을 제어하는 ​​것을 밝혀 :

UPDATE, 이건 내 문제를 해결 다음을 설정하십시오.

<system.web> 
    <httpRuntime maxRequestLength="900000"/> 

희망이 거기 밖으로 두통을 돌봐!

+0

GUID 목록을 JSON 배열로 전달해 보았습니까? –

+0

IMO 브라우저 항목 일 수 있습니다 (http://bytes.com/topic/javascript/answers/92088-max-allowed-length-javascript-string). –

+0

요청이 성공하면 Fiddler에서 본 HTTP 요청/응답의 실제 크기는 얼마입니까? –

답변

2

실제 제한은 8192 바이트 인 것 같습니다.

당신은는 system.serviceModel 태그에 당신의 Web.config를 확인해야 :

<system.serviceModel> 
    <bindings> 
    <basicHttpBinding> 
    <binding name="Service1Soap" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
     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> 
    </basicHttpBinding> 
    </bindings> 

당신은 더 큰 값으로 maxStringContentLength = "8192"을 변경해야합니다.

각 요청마다 오프셋 매개 변수를 사용하여 GUID 목록을 페이지 단위로 가져 오기 위해 하나 대신 복수 요청을 할 수도 있습니다. 예를 들어 페이지 수가 200 인 GUID 목록을 얻으려면 먼저 offset = 0으로 요청하고 offset = 200으로 두 번째 요청을하면 200 개 미만의 항목을 가져옵니다.

1

나는 당신에게별로 도움이되지 않을 것이라는 것을 알고 있지만, JSON 사양이 아무런 제한도 설정하지 않았다는 것을 지적하고 싶습니다. 그러나, 파서 그렇게 할 수 있습니다 :

구현은
받아들이 텍스트의 크기에 대한 제한을 설정할 수 있습니다. 구현시 최대 깊이가
중첩으로 설정 될 수 있습니다. 구현에 따라 숫자 범위가 제한 될 수 있습니다.
구현시 문자열의 길이 및 문자 내용 에 대한 제한을 설정할 수 있습니다.this answer 당신에게 적용되는 경우

RFC4627: The application/json Media Type for JavaScript Object Notation (JSON)

을 참조하십시오.