2010-10-27 25 views
9

Tôi có vấn đề với các lỗi sau: "Hạn ngạch kích thước tin nhắn tối đa cho tin nhắn đến (65536) đã bị vượt quá Để tăng hạn ngạch, sử dụng tài sản MaxReceivedMessageSize trên các yếu tố ràng buộc thích hợp."Tại sao Dịch vụ WCF của tôi không tải cấu hình Binding của tôi?

Vì vậy, tôi đã làm một số nghiên cứu và thấy rằng tôi cần thiết để tăng bộ đệm và kích thước thư, đây là WCF tập tin dịch vụ cấu hình của tôi:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="default" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"/> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service name="WCF.Service.Service"> 
     <endpoint address="ws" name="ws" bindingConfiguration="default" binding="wsHttpBinding" contract="WCF.Service.Contracts.IService" /> 
     <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="True" /> 
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Khi tôi chạy dịch vụ ở client WCF Test và nhìn vào cấu hình máy khách tạo ra tập tin đó không có ràng buộc của tôi:

<configuration> 
<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="ws" closeTimeout="00:01:00" openTimeout="00:01:00" 
       receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" 
       transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
       maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
       messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
       allowCookies="false"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
        maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" 
        enabled="false" /> 
       <security mode="Message"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" 
         realm="" /> 
        <message clientCredentialType="Windows" negotiateServiceCredential="true" 
         algorithmSuite="Default" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:37444/Service.svc/ws" binding="wsHttpBinding" 
      bindingConfiguration="ws" contract="IService" name="ws"> 
      <identity> 
       <userPrincipalName value="[email protected]" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Tôi bị mất là tại sao cấu hình ràng buộc của tôi là KHÔNG nhận được áp dụng !? WCF Test Client được thiết lập để luôn luôn tái tạo cấu hình là tốt. Tôi cũng đã cố gắng cập nhật các tài liệu tham khảo dịch vụ trong một ứng dụng kết thúc trước tiêu thụ, nhưng nó không không có được cấu hình ràng buộc cập nhật hoặc. Bất kỳ đề xuất sẽ được đánh giá rất cao. Cảm ơn!

+0

Dường như với tôi như khách hàng của bạn đang nhận được sự ràng buộc của bạn ... –

+0

Nhưng nó không có giá trị maxBufferPoolSize và maxReceivedMessageSize lớn hơn ... – MisterIsaak

Trả lời

11

WCF thực hiện không nhập tất cả cài đặt từ máy chủ của bạn. Không có công tắc để bật tính năng này. Mặc dù nó có thể có ý nghĩa trong nhiều trường hợp, nó sẽ không luôn luôn là một ý tưởng tốt để chỉ cần sao chép tất cả các thiết lập từ phía máy chủ cho khách hàng.

Vì vậy, trong trường hợp của bạn, những gì bạn cần làm là thêm cấu hình ràng buộc đó vào proxy bên ứng dụng khách của bạn, và tham chiếu nó từ điểm cuối ứng dụng khách của bạn.

Nếu bạn điều khiển cả hai đầu của dây, bạn có thể giảm bớt công việc của mình một chút: ngoài cấu hình ràng buộc vào một tệp riêng và tham chiếu nó.

Vì vậy, tạo một file bindings.config có chứa:

<?xml version="1.0" ?> 
<bindings> 
    <wsHttpBinding> 
     <binding name="default" 
       maxBufferPoolSize="2147483647" 
       maxReceivedMessageSize="2147483647"/> 
    </wsHttpBinding> 
</bindings> 

và sau đó bạn có thể sao chép tập tin đó cả hai vào máy chủ và các dự án của khách hàng, và tham khảo nó từ bên trong dịch vụ và khách hàng của bạn cấu hình:

<system.serviceModel> 
    <bindings configSource="bindings.config" /> 
    <services> 
     <service name="WCF.Service.Service"> 
     <endpoint address="ws" name="ws" bindingConfiguration="default" binding="wsHttpBinding" contract="WCF.Service.Contracts.IService" /> 
     <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" /> 
     </service> 
    </services> 

và đứng về phía khách hàng của bạn:

<system.serviceModel> 
    <bindings configSource="bindings.config" /> 
    <client> 
     <endpoint name="ws" 
      address="http://localhost:37444/Service.svc/ws" 
      binding="wsHttpBinding" 
      bindingConfiguration="default" 
      contract="IService"> 
      <identity> 
       <userPrincipalName value="[email protected]" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 

Bằng cách đó, y Bạn có thể có cấu hình cho các kết nối được thực hiện một lần và được sử dụng ở cả hai nơi.

+0

Wow, cảm ơn lời giải thích tuyệt vời! Vì vậy, vì phía máy khách không tiêu thụ các cấu hình ràng buộc từ máy chủ, tôi bắt buộc phải cấu hình các cài đặt riêng cho chúng một cách thủ công. Tôi giả định khi bạn lần đầu tiên tham khảo dịch vụ mà khách hàng phải xem loại ràng buộc và thiết lập các giá trị mặc định cần thiết. Cảm ơn một lần nữa! – MisterIsaak

2

maxBufferPoolSize và maxReceivedMessageSize không được tiếp xúc với máy khách, chỉ máy chủ mới nhận thức được chúng. kích thước mà máy khách đang sử dụng là mặc định, chỉ cần thay đổi chúng thành kích thước bạn muốn. rõ ràng đây là vấn đề nếu bạn đang tái tạo nó rất nhiều, nhưng tôi không nghĩ rằng có nhiều thay thế.

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