2012-02-02 52 views
10

Tôi đang gọi dịch vụ web WCF của tôi bằng cách sử dụng jQuery $ .ajax json POST.

Một trong các thông số đầu vào rất dài - trên 8000 byte. Dữ liệu trong đó là danh sách GUID được phân tách bằng dấu phẩy, như sau "78dace54-1eea-4b31-8a43-dcd01e172d14, ce485e64-e7c6-481c-a424-2624371180aa, ede4c606-f743-4e0a-a8cc-59bcffa7feda, f0a81ed1-80db- 4f6d-92d7-2fc47759a409 ".

Khi thông số đó là 8176 bytes dài, yêu cầu thành công. Khi đó là (thêm một dấu phẩy và GUID) - yêu cầu không thành công.

Trình duyệt không hoạt động và từ Fiddler (proxy gỡ lỗi HTTP). tôi thêm này để cấu hình webservice:Giới hạn kích thước tham số JSON

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

Điều đó không thực hiện bất kỳ sự khác biệt, theo yêu cầu vẫn không cho param đầu vào dài hơn 8176 byte.
Tham số đầu vào đó ánh xạ vào một Chuỗi ở phía WCF.
Tôi đang thiếu gì? Cảm ơn bạn!

CẬP NHẬT, điều này giải quyết vấn đề của tôi: Hóa ra rằng thiết lập này điều khiển tổng JSON dài nhắn

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

Có một thiết lập điều khiển chiều dài tối đa cho các thông số cá nhân:

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

Cũng , hãy đảm bảo đặt điều này:

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

Hy vọng điều này sẽ chăm sóc một số cơn đau đầu ở ngoài đó!

+0

Bạn đã thử có danh sách GUID được chuyển dưới dạng mảng JSON chưa? –

+0

IMO nó có thể là [điều trình duyệt] (http://bytes.com/topic/javascript/answers/92088-max-allowed-length-javascript-string). –

+0

Khi yêu cầu thành công, kích thước thực tế của yêu cầu/trả lời http được thấy trong Fiddler là bao nhiêu? –

Trả lời

2

Giới hạn thực tế có vẻ là 8192 byte.

Bạn phải kiểm tra Web.config trong thẻ System.ServiceModel:

<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> 

Bạn cần thay đổi maxStringContentLength = "8192" đến một giá trị lớn hơn.

Bạn cũng có thể thực hiện nhiều yêu cầu thay vì một để nhận danh sách trang GUID theo trang, sử dụng thông số bù trừ trong mỗi yêu cầu. Ví dụ: để có danh sách GUID theo trang 200, trước tiên hãy yêu cầu với offset = 0, thứ hai với offset = 200, ... cho đến khi bạn nhận được ít hơn 200 mục.

1

Tôi biết nó sẽ không có nhiều trợ giúp cho bạn nhưng tôi muốn chỉ ra rằng thông số JSON không đặt bất kỳ giới hạn nào; tuy nhiên, nó cho phép các trình phân tích cú pháp làm như vậy:

Việc triển khai có thể đặt giới hạn về kích thước văn bản mà nó
chấp nhận. Triển khai có thể đặt giới hạn ở độ sâu tối đa
làm tổ. Việc triển khai có thể đặt giới hạn trên phạm vi số.
Việc triển khai có thể đặt giới hạn về độ dài và nội dung ký tự của chuỗi.

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

Xem nếu this answer áp dụng cho bạn.

Các vấn đề liên quan