2013-04-28 31 views
20

Cài đặt của tôi:WCF Lỗi - Hạn ngạch kích thước tin nhắn tối đa cho tin nhắn đến (65536) đã bị vượt quá

  • ASP.NET khách hàng lưu trữ trong IIS nhanh
  • WCF Service tổ chức trong Console Application
  • Chạy Visual Studio.NET 2012 trong chế độ Quản trị

Tôi đang cố trả về 2 Liệt kê các đối tượng từ dịch vụ WCF. Thiết lập của tôi HOẠT ĐỘNG MỸ khi tôi trở lại chỉ 1 Danh sách các đối tượng. Nhưng khi tôi trả về 2 Danh sách các đối tượng, tôi gặp lỗi:

Đã vượt quá hạn ngạch kích thước thư tối đa cho thư đến (65536). Để tăng hạn ngạch, hãy sử dụng thuộc tính MaxReceivedMessageSize trên phần tử ràng buộc phù hợp.

Tôi biết rằng câu hỏi này đã được hỏi nhiều lần trên trang web này và các trang web khác. Tôi đã cố gắng gần như tất cả mọi thứ được đăng trên internet với các kết hợp khác nhau của FILE CONFIG nhưng vẫn điều này đã không làm việc cho tôi.

Khách hàng Config:

<configuration> 
    <system.web> 
     <compilation debug="true" targetFramework="4.0" /> 
     <httpRuntime maxRequestLength="1572864"/> 
    </system.web> 

    <system.serviceModel> 
     <client> 
      <endpoint name="basicHttpBinding" 
       address="http://localhost:9502/HCDataService" 
       binding="basicHttpBinding" 
       bindingConfiguration="basicHttpBinding"     
       contract="HC.APP.Common.ServiceContract.IHCServiceContract" 
       behaviorConfiguration="ServiceBehaviour"> 
      </endpoint> 
     </client> 

     <bindings> 
      <basicHttpBinding> 
       <binding name="basicHttpBinding" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"> 
        <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="2147483646" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 

     <behaviors> 
      <endpointBehaviors> 
       <behavior name="ServiceBehaviour"> 
        <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

server Config:

<configuration> 
    <system.serviceModel> 
     <services> 
      <service name="HC.APP.Server.Service.HCDataService" behaviorConfiguration="ServiceBehaviour"> 
       <host> 
        <baseAddresses> 
         <add baseAddress="http://localhost:9502/HCDataService"/> 
        </baseAddresses> 
       </host> 

       <endpoint name="basicHttpBinding" 
        address="http://localhost:9502/HCDataService" 
        binding="basicHttpBinding" 
        bindingConfiguration="basicHttpBinding" 
        contract="HC.APP.Common.ServiceContract.IHCServiceContract"> 
       </endpoint> 
      </service> 
     </services> 

     <bindings> 
      <basicHttpBinding> 
       <binding name="basicHttpBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="01:50:00" openTimeout="01:50:00" sendTimeout="01:50:00" receiveTimeout="01:50:00" > 
        <readerQuotas maxDepth="128" maxStringContentLength="8388608" maxArrayLength="2147483646" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       </binding> 
      </basicHttpBinding> 
     </bindings> 

     <behaviors> 
      <serviceBehaviors> 
       <behavior name="ServiceBehaviour"> 
        <serviceDebug includeExceptionDetailInFaults="true" /> 
        <serviceMetadata httpGetEnabled="true" /> 
        <dataContractSerializer ignoreExtensionDataObject="false" maxItemsInObjectGraph="2147483646" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors>  
    </system.serviceModel> 
</configuration> 
+0

Tôi đã cập nhật cả tệp cấu hình theo đề xuất của Trickery vì lợi ích của các thành viên khác. Đây là một giải pháp làm việc. Một thay đổi nữa mà tôi đã thực hiện là maxArrayLength = "2147483646" trên cả hai cấu hình. Và có việc đặt tên cho các điểm cuối có thể được cải thiện. –

+2

Các bạn, tôi biết đây là câu hỏi trùng lặp và đề cập đến điều này trong bài đăng của tôi. Lý do tôi đã phải gửi câu hỏi này (và có lẽ tại sao rất nhiều biến thể của cùng một câu hỏi tồn tại), là bởi vì cấu hình WCF được tuân thủ và nó rất dễ dàng để bỏ lỡ một chi tiết nhỏ.Tôi đã đi qua rất nhiều bài viết trên trang web này cũng như các trang web khác nhưng không thể chỉ ra vấn đề. Nó đòi hỏi một chút can thiệp bên ngoài để giải quyết vấn đề. Vì vậy, về mặt kỹ thuật bài viết của tôi có thể âm thanh trùng lặp, nhưng nó khác trong MINOR CONFIG THAY ĐỔI mà Trickery chỉ ra. –

Trả lời

33

Đó sẽ là bởi vì bạn đã không xác định trên máy chủ mà ràng buộc để sử dụng. Hãy xem cấu hình máy chủ của bạn:

Dưới <bindings> bạn đang tạo cấu hình ràng buộc cho <basicHttpBinding> và bạn đang đặt tên nó là name="basicHttpBinding". Ngoài ra, tên điểm cuối của bạn là <endpoint name="basicHttpBinding" ...> và ràng buộc của nó là binding="basicHttpBinding". Tuy nhiên, nó không đề cập đến cấu hình ràng buộc của bạn, nhưng với ràng buộc loại. Vì vậy, nó thực sự sử dụng các thiết lập mặc định cho basicHttpBinding.

Để khắc phục điều này, trước hết hãy đặt tên cho điểm cuối và cấu hình ràng buộc của bạn theo cách khác. Ví dụ: <endpoint name="basicEndpoint" ... ><binding name="myBasicBinding" ... >. Sau đó, bạn cần gán cấu hình ràng buộc cho điểm cuối của mình với thuộc tính này: bindingConfiguration="myBasicBinding".

Dưới đây là cấu hình client:

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

<system.serviceModel> 
    <client> 
     <endpoint name="basicEndpoint" 
      address="http://localhost:9502/HCDataService" 
      binding="basicHttpBinding" 
      bindingConfiguration="myBasicBinding" 
      contract="HC.APP.Common.ServiceContract.IHCServiceContract" 
      behaviorConfiguration="ServiceBehaviour"> 
     </endpoint> 
    </client> 

    <bindings> 
     <basicHttpBinding> 
      <binding name="myBasicBinding" maxBufferSize="2147483647" maxBufferPoolSize="524288" maxReceivedMessageSize="2147483647"> 
       <readerQuotas maxDepth="128" maxStringContentLength="2147483647" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 

    <behaviors> 
     <endpointBehaviors> 
      <behavior name="ServiceBehaviour"> 
       <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors>  
</system.serviceModel> 

Dưới đây là cấu hình máy chủ:

<system.serviceModel> 
    <services> 
     <service name="HC.APP.Server.Service.HCDataService" behaviorConfiguration="ServiceBehaviour"> 
      <host> 
       <baseAddresses> 
        <add baseAddress="http://localhost:9502/HCDataService"/> 
       </baseAddresses> 
      </host> 

      <endpoint name="basicEndpoint" 
       address="http://localhost:9502/HCDataService" 
       binding="basicHttpBinding" 
       bindingConfiguration="myBasicBinding" 
       contract="HC.APP.Common.ServiceContract.IHCServiceContract"> 
      </endpoint> 
     </service> 
    </services> 

    <bindings> 
     <basicHttpBinding> 
      <binding name="myBasicBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="01:50:00" openTimeout="01:50:00" sendTimeout="01:50:00" receiveTimeout="01:50:00" > 
       <readerQuotas maxDepth="128" maxStringContentLength="8388608" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 

    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceBehaviour"> 
       <serviceDebug includeExceptionDetailInFaults="true" /> 
       <serviceMetadata httpGetEnabled="true" /> 
       <dataContractSerializer ignoreExtensionDataObject="false" maxItemsInObjectGraph="2147483646" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

Đừng quên update service reference về khách hàng của bạn để có được cấu hình chính xác.

+0

Hai điều: Đầu tiên, OP cần áp dụng điều này cho ** khách hàng ** của mình chứ không phải cấu hình dịch vụ. Họ đang gặp sự cố này khi cố gắng * nhận * từ dịch vụ, chứ không phải gửi. Thứ hai, họ đã đặt tên cho ràng buộc, họ chỉ không đặt nó một cách rõ ràng vào điểm cuối, như bạn đã chỉ ra. – Tim

+0

Uhh, không. Vấn đề là máy chủ ở đây. Cấu hình máy khách chỉ phản ánh cấu hình của máy chủ khi bạn thêm tham chiếu dịch vụ. Thứ hai, tôi không bao giờ nói OP không nêu tên, chỉ là anh ta đặt tên nó theo một cách khó hiểu và có lẽ tại sao anh ta đã phạm sai lầm ngay từ đầu, như tôi đã nói ở đoạn 2. – Artless

+0

Điểm về vấn đề đặt tên (I bỏ lỡ điều đó khi lần đầu tiên tôi đọc câu trả lời của bạn) và tôi đồng ý. Tuy nhiên, điều này ** là ** một vấn đề của khách hàng. 'maxReceivedMessageSize', trong trường hợp này, áp dụng cho máy khách. Các thiết lập hạn ngạch ở phía dịch vụ hoàn toàn không có gì để làm với các thiết lập hạn ngạch ở phía máy khách. Nói chung nó đơn giản hơn để giữ chúng giống nhau trên cả hai mặt, nhưng chỉ vì dịch vụ có thể nhận được. nói rằng tệp 1 GB không có nghĩa là khách hàng có thể - trừ khi hạn ngạch của nó đủ lớn. – Tim