2013-01-31 9 views
25

Moje wezwanie do mojego serwisu WWW WCF się niepowodzeniem z System.Net.WebException: The request failed with HTTP status 413: Request Entity Too Large.maxReceivedMessageSize nie ustalające 413: Zbyt duże żądanie

Sprawdzanie Skrzypek, widzę, że wyślę:

Content-Length: 149839

Który ma ponad 65KB.

Włączanie śledzenia WCF na serwerze, widzę:

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

Dodawanie tej właściwości nie rozwiązuje problemu.

Próbowałem już z tą własnością i (później) z różnymi innymi, które sugerowały posty. Oto co mam obecnie (na serwerze):

<basicHttpBinding> 

    <binding name="PricerServiceSoap" 
    closeTimeout="00:10:00" openTimeout="00:10:00" 
    receiveTimeout="00:10:00" sendTimeout="00:10:00" 
    maxBufferSize="2147483647"  
    maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"> 

    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
     maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
     maxNameTableCharCount="2147483647" /> 
    </binding> 

</basicHttpBinding> 

moim jedynym punkt końcowy (pod <client>) wynosi:

<endpoint address="/NetPricingService/Service.asmx" 
    binding="basicHttpBinding" bindingConfiguration="PricerServiceSoap" 
    contract="Pricing.PricerService.PricerServiceSoap" 
    name="PricerServiceSoap" /> 

Dodałem także:

<dataContractSerializer maxItemsInObjectGraph="2147483647"/> 

pod <behavior>.

mam nawet uruchomić (na IIS 7):

%windir%\system32\inetsrv\appcmd set config "WebServicesDev/PricingService" 
-section:requestFiltering -requestLimits.maxAllowedContentLength:104857600 
-commitpath:apphost 

Nic nie czyni żadnej różnicy.

Jeden połów polega na tym, że jest to usługa WCF przeznaczona do zastąpienia starszej usługi ASMX. Szkielet usługi został wygenerowany za pomocą svcutil z istniejącego WSDL. Nie mogę zmienić konfiguracji klienta (a klienci są w wielu językach). Mój projekt klienta testowego zaimportował usługę za pomocą Dodaj odniesienie do sieci (pod Add Service Reference/Advanced), więc nie mam konfiguracji WCF. Jednak klient testowy działa, jeśli wskażę go na starszą usługę ASMX.

Jak mogę to naprawić lub zdiagnozować?

Dodatkowe informacje

Jeśli używam Microsoft Service Edytora konfiguracji, aby wygenerować config (ustawienie maxReceivedMessageSize i maxBufferSize), to działa. Problem polega na tym, że punkt końcowy jest określony pod numerem <service> i nie pozwala mi podać względnego adresu /NetPricingService/Service.asmx. Jeśli edytuję wiązania w konfiguracji generowanej przez svcutil (gdzie punkt końcowy znajduje się pod <client>), to nie działa on w przypadku dużych żądań.

Odpowiedz

24

Odpowiedź patrzyła mi w twarz.

Konfiguracja wygenerowana przez svcutil była dla klienta. Używałem go na serwerze.

Edytowałem powiązania dla punktów końcowych określonych pod <client>, które nie miały absolutnie żadnej różnicy dla usługi.

Dodanie odpowiedniego punktu końcowego <service> i ustawienie maxReceivedMessageSize i maxBufferSize na powiązaniu rozwiązało problem.

+3

Aby dodać do specyfiki odpowiedź TrueWill za: Trzeba dodać tag do web.config którym odbywa usługa internetowa nie którym usługa zmienić tag w pliku web.config jest związany. W znaczniku dodaj odwołanie do nowego powiązania za pomocą instrukcji binding. Utwórz nowe powiązanie w węźle powiązań i dodaj tam ustawienia maxBufferPoolSize i maxReceivedMessageSize. –

+1

Dzięki za to. Mógłbym przejść cały dzień, nie zauważając tego. –

+1

To w końcu doprowadziło mnie do mojego rozwiązania. "Prosta" konfiguracja .NET4, w której sekcja "" nie jest "wymagana", nie korzystała z mojego httpBinding. Dodanie usługi jawnie z powiązaniem rozwiązało problem. – user2864740

23

Miałem podobny problem. Dla mnie problem polegał na tym, że mój punkt końcowy nie nazwał wiązania w sposób jawny za pomocą bindingConfiguration i dlatego musiał używać gdzieś jakiegoś domyślnego.

miałem:

<webHttpBinding> 
    <binding 
     name="myXmlHttpBinding" 
     maxReceivedMessageSize="10485760" 
     maxBufferSize="10485760"> 
     <readerQuotas 
      maxDepth="2147483647" 
      maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647"/> 
     <security mode="None"/> 
    </binding> 
</webHttpBinding> 

i mój punkt końcowy zdefiniowano jako:

<service 
    name="blah.SomeService"> 
    <endpoint 
     address="" 
     behaviorConfiguration="WebHttpBehavior" 
     binding="webHttpBinding" 
     contract="blah.ISomeService"> 

     <identity> 
      <dns value="localhost"/> 
     </identity> 
    </endpoint> 
</service> 

Udało raz zmieniłem punkt końcowy do:

<service name="blah.SomeService"> 
    <endpoint address="" 
     behaviorConfiguration="WebHttpBehavior" 
     binding="webHttpBinding" 
     bindingConfiguration="myXmlHttpBinding" 
     contract="blah.ISomeService"> 
     <identity> 
     <dns value="localhost"/> 
     </identity> 
    </endpoint> 
    </service> 
0

dodać to rozwiązać to dla mnie:

<bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_Example" 
maxBufferSize="2147483647" 
maxReceivedMessageSize="2147483647"> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
1

Próbowałem rzeczy z 10 różnych blogów i mój współpracownik to wymyślił. Musieliśmy dodać sekcję basicHttpsBinding wewnątrz oprócz sekcji basicHttpBinding. Mamy usługę webapi wywołującą wcf. metoda webapi wychwyciła błąd zbyt dużego obiektu, gdy wywołał metodę usługi wcf. Ta zmiana została zastosowana w pliku web.config usługi wcf.

Powiązane problemy