2011-11-13 10 views
6

Bóg nie po prostu kochasz WCF.Dreaded WCF BAD request 400 ze względu na maxReceivedMessageSize wciąż będący 65536

Przeczytałem wszystkie możliwe wątki, ale naprawdę utknąłem.

Oto konfiguracja WCF:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BaseHttp" 
        maxBufferSize="4194304" 
        maxBufferPoolSize="4194304" 
        maxReceivedMessageSize="4194304" /> 
     </basicHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="TaskServiceBehavior"> 
      <serviceMetadata httpGetEnabled="True" /> 
      <serviceDebug includeExceptionDetailInFaults="True" /> 
     </behavior> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="TaskServiceBehavior" name="TaskService"> 
     <endpoint 
      address="http://www.mysite.com/TableTaskService/TableTaskService.svc" 
      binding="basicHttpBinding" bindingConfiguration="BaseHttp" 
      contract="TableTaskService.ITableTaskService" /> 
     <endpoint 
      address="mex" 
      binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
       <add baseAddress="http://www.mysite.com/TableTaskService/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <serviceHostingEnvironment> 
     <baseAddressPrefixFilters> 
     <add prefix="http://www.mysite.com/" /> 
     </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
</system.serviceModel> 

Teraz mogę wysłać wiadomość i trafiają to domyślne wyjątek (piły w svclog pliku):

Maksymalna kwota rozmiar wiadomości dla wiadomości przychodzących (65536) został przekroczony o . Aby zwiększyć limit, użyj właściwości MaxReceivedMessageSize na odpowiednim elemencie wiązania.

Teraz wyraźnie stwierdzam, że powinna wynosić 4mb.

Mój kod klienta:

TableTaskServiceClient client = 
    new TableTaskServiceClient(
      new BasicHttpBinding { MaxBufferSize = 4194304, 
           MaxReceivedMessageSize = 4194304 }, 
      new EndpointAddress(GetEndpointAddressString()) 
    ); 

Jeszcze rzuca ten błąd 65536 rozmiar na mnie. Skąd się bierze? ..

Czy to NAPRAWDĘ ma znaczenie, że klient ustawia MaxReceivedMessageSize na tę samą wartość co serwer? Myślę, że logiczne byłoby, że serwer był odpowiedzialny za określenie długości, a nie klienta.

Istnieje również to ostrzeżenie (zauważ, jak użyteczne jest to, co mówi, to znaczy: brak informacji o elemencie, który zostanie przesłonięty lub coś mi brakuje), może to właśnie to, co jest przesłonięte? ale dlaczego miałoby to być? i tak:

[TraceRecord] Ciężkość ostrzegawczy TraceIdentifier http://msdn.microsoft.com/en-US/library/System.ServiceModel.OverridingDuplicateConfigurationKey.aspx Opis konfiguracji systemu wykrył duplikat klucza w różnym zakresie konfiguracji i nadrzędne z bardziej aktualną wartość . AppDomain/LM/W3SVC/11/ROOT/TableTaskService-33-1296567 Źródło System.ServiceModel.Configuration.ServiceBehaviorElementCollection/-851144413 zachowanie ElementName OldElementLineNumber 0 NewElementLineNumber 0

UPDTE: rekonfigurowane zarówno usługi i klienta:

TableTaskServiceClient client = new TableTaskServiceClient(
         new BasicHttpBinding { 
          MaxBufferSize = 4194304, 
          MaxReceivedMessageSize = 4194304, 
          MaxBufferPoolSize=4194304, 
          ReaderQuotas = new XmlDictionaryReaderQuotas 
               { 
                MaxArrayLength = 4194304, 
                MaxBytesPerRead = 4194304, 
                MaxDepth = 4194304, 
                MaxNameTableCharCount = 4194304, 
                MaxStringContentLength = 4194304 
               } 
         }, new EndpointAddress(GetEndpointAddressString())); 

Ten sam błąd nadal występuje.

Jeśli tak jest z pewnym zainteresowaniem poślę byte [] tablicę 467000 ~ długość

Odpowiedz

1

Spróbuj:

<basicHttpBinding> 
    <binding name="BaseHttp" 
      maxBufferSize="4194304" 
      maxBufferPoolSize="4194304" 
      maxReceivedMessageSize="4194304"> 
    <readerQuotas maxArrayLength="4194304" 
        maxBytesPerRead="4194304" 
        maxDepth="4194304" 
        maxNameTableCharCount="4194304" 
        maxStringContentLength="4194304" 
        /> 
    </binding> 
</basicHttpBinding> 

Chociaż niektóre z tych ustawień nie mają sensu, po prostu ustawię je na dużą wartość.

Ponadto, gdy już to zrobisz, zdecydowanie sugeruję, aby zmniejszyć wartości, ponieważ są one obecne, aby uniemożliwić DoS attacks w Twojej witrynie.

+0

Ten sam błąd. Kilka razy potwierdziłem, że ta konfiguracja jest używana w konfiguracji usługi (zmieniono na BaseHttp1, błąd piły, zmieniono z powrotem, usługa działa dobrze w przeglądarce), ale wciąż jest taka sama. Wierzę, że to powinno działać ... ale po prostu nie działa. –

+0

Czy konfigurujesz zarówno usługę, jak i klienta? Bo ja bym się założył, że po stronie klienta jest też ustawienie czapki. –

+0

tak zrekonfigurował oba miejsca. –

Powiązane problemy