.net - WCF-Wie man das Nachrichtengrößen-Kontingent erhöht




asp.net .net-3.5 (8)

Ich habe einen WCF-Dienst, der 1000 Datensätze von der Datenbank an den Client zurückgibt. Ich habe einen ASP.NET WCF-Client (Ich habe Service-Referenz in ASP.net-Webanwendungsprojekt hinzugefügt, WCF zu konsumieren).

Ich erhalte folgende Meldung, wenn ich die Client-Anwendung ausführe:

Das maximale Nachrichtengrößenkontingent für eingehende Nachrichten (65536) wurde überschritten. Verwenden Sie die MaxReceivedMessageSize-Eigenschaft für das entsprechende Bindungselement, um das Kontingent zu erhöhen.

Irgendeine Hilfe? Wie kann das Nachrichtengrößenkontingent erhöht werden?


Der WCF Test Client hat eine eigene Client-Konfiguration.

Führen Sie den Test-Client aus und scrollen Sie nach unten. Wenn Sie auf den Knoten Konfigurationsdatei doppelklicken, wird die XML-Darstellung angezeigt. Wie Sie sehen können, ist die maxReceivedMessageSize 65536 .

Um dies zu bearbeiten, klicken Sie mit der rechten SvcConfigEditor Knoten SvcConfigEditor und wählen Sie Bearbeiten mit SvcConfigEditor . Wenn der Editor geöffnet wird, erweitern Sie Bindings und doppelklicken Sie auf die Bindung, die automatisch generiert wurde.

Sie können hier alle Eigenschaften bearbeiten, einschließlich maxReceivedMessageSize . Wenn Sie fertig sind, klicken Sie auf Datei - Speichern .

Wenn Sie wieder im WCF Test Client-Fenster sind, klicken Sie auf Extras - Optionen .

HINWEIS : Deaktivieren Sie die Option Konfiguration beim Starten von Diensten immer neu generieren .


Für HTTP:

<bindings>
  <basicHttpBinding>
    <binding name="basicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000" 
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="200" 
             maxArrayLength="200000000"
             maxBytesPerRead="4096"
             maxStringContentLength="200000000"
             maxNameTableCharCount="16384"/>
    </binding>
  </basicHttpBinding>
</bindings>

Für TCP:

<bindings>
  <netTcpBinding>
    <binding name="tcpBinding"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
      <readerQuotas maxDepth="200"
           maxArrayLength="200000000"
           maxStringContentLength="200000000"
           maxBytesPerRead="4096"
           maxNameTableCharCount="16384"/>
    </binding>
  </netTcpBinding>
</bindings>

WICHTIG:

Wenn Sie versuchen, komplexe Objekte zu übergeben, die viele verbundene Objekte haben (zB: eine Baumstruktur, eine Liste mit vielen Objekten ...), wird die Kommunikation fehlschlagen, egal wie Sie die Kontingente erhöht haben. In solchen Fällen müssen Sie die Anzahl der enthaltenen Objekte erhöhen:

<behaviors>
  <serviceBehaviors>
    <behavior name="NewBehavior">
      ...
      <dataContractSerializer maxItemsInObjectGraph="2147483646"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

Ich habe diesen Fehler bei der Verwendung dieser Einstellungen in web.config erhalten

System.ServiceModel.ServiceActivationException

Ich setze Einstellungen wie folgt:

      <service name="idst.Controllers.wcf.Service_Talks">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_TalksAspNetAjaxBehavior"
      binding="webHttpBinding" contract="idst.Controllers.wcf.Service_Talks" />
  </service>
  <service name="idst.Controllers.wcf.Service_Project">
    <endpoint address="" behaviorConfiguration="idst.Controllers.wcf.Service_ProjectAspNetAjaxBehavior"
      binding="basicHttpBinding" bindingConfiguration="" bindingName="largBasicHttp"
      contract="idst.Controllers.wcf.Service_Project" />
  </service>
</services>

<bindings>
<basicHttpBinding>
    <binding name="largBasicHttp" allowCookies="true"
             maxReceivedMessageSize="20000000"
             maxBufferSize="20000000"
             maxBufferPoolSize="20000000">
        <readerQuotas maxDepth="32"
             maxArrayLength="200000000"
             maxStringContentLength="200000000"/>
    </binding>
</basicHttpBinding>


Ich habe mein Problem mit Bing Maps WPF in meinem Projekt "CalculateRoute ()" gelöst. Die Lösung in meinem Fall war die Einstellung von maxReceivedMessageSize und maxReceivedMessageSize für das Attribut "httpTransport" für den Abschnitt "customBinding".

Ich habe diese Konfiguration in der Datei applications.config (zB myApp.config) festgelegt:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IGeocodeService" />
            <binding name="BasicHttpBinding_IRouteService" />
        </basicHttpBinding>
        <customBinding>
            <binding name="CustomBinding_IGeocodeService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
            <binding name="CustomBinding_IRouteService">
                <binaryMessageEncoding />
              <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                                maxReceivedMessageSize="2147483647" allowCookies="false" authenticationScheme="Anonymous"
                                bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
                                keepAliveEnabled="true" maxBufferSize="2147483647" proxyAuthenticationScheme="Anonymous"
                                realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                                useDefaultWebProxy="true" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="BasicHttpBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/geocodeservice/GeocodeService.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IGeocodeService"
            contract="BingServices.IGeocodeService" name="CustomBinding_IGeocodeService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IRouteService"
            contract="BingServices.IRouteService" name="BasicHttpBinding_IRouteService" />
        <endpoint address="http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc/binaryHttp"
            binding="customBinding" bindingConfiguration="CustomBinding_IRouteService"
            contract="BingServices.IRouteService" name="CustomBinding_IRouteService" />
    </client>
</system.serviceModel>

Sie möchten, dass die Größenkontingente für Nachrichten in der App.config- oder Web.config- Datei wie folgt erhöht werden:

<bindings>
    <basicHttpBinding>
        <binding name="basicHttp" allowCookies="true"
                 maxReceivedMessageSize="20000000" 
                 maxBufferSize="20000000"
                 maxBufferPoolSize="20000000">
            <readerQuotas maxDepth="32" 
                 maxArrayLength="200000000"
                 maxStringContentLength="200000000"/>
        </binding>
    </basicHttpBinding>
</bindings>

Und verwenden Sie den Bindungsnamen in Ihrer Endpunktkonfiguration, z

...
bindingConfiguration="basicHttp"
...

Die Begründung für die Werte ist einfach, sie sind ausreichend groß, um die meisten Nachrichten aufzunehmen. Sie können diese Nummer an Ihre Bedürfnisse anpassen. Der niedrige Standardwert dient hauptsächlich dazu, DOS-Angriffe zu verhindern. Würde man es 20000000 machen, würde ein verteilter DOS-Angriff effektiv sein, die Standardgröße von 64k würde eine sehr große Anzahl von Clients erfordern, um die meisten Server in diesen Tagen zu überwältigen.


Vergessen Sie nicht, dass die Datei app.config des Ausführungseinstiegspunkts berücksichtigt wird, nicht die in der Klassenbibliothek, in der Web-Service-Aufrufe verwaltet werden, wenn eine vorhanden ist.

Wenn Sie beispielsweise den Fehler beim Ausführen des Komponententests erhalten, müssen Sie im Testprojekt eine entsprechende Konfiguration einrichten.


Wenn diese Fehlermeldung bei der Verwendung des WCF- Testclients weiterhin angezeigt wird , liegt das daran, dass der Client über eine separate Einstellung für MaxBufferSize verfügt .

So beheben Sie das Problem:

  1. Klicken Sie mit der rechten Maustaste auf den Knoten Konfigurationsdatei am unteren Rand der Baumstruktur
  2. Wählen Sie Bearbeiten mit SvcConfigEditor

Eine Liste bearbeitbarer Einstellungen wird angezeigt, einschließlich MaxBufferSize.

Hinweis: Automatisch generierte Proxy-Clients setzen MaxBufferSize standardmäßig auf 65536.


Eine weitere wichtige Sache aus meiner Erfahrung zu betrachten ..

Ich rate dringend, maxBufferPoolSize nicht zu maximieren, da Puffer aus dem Pool niemals freigegeben werden, bis die App-Domäne (dh der Anwendungspool) wiederverwendet wird.

Eine Periode mit hohem Datenverkehr kann dazu führen, dass viel Speicher verwendet und nicht freigegeben wird.

Weitere Details hier: