wake-up-neo.com

WCF - Erhöhen des Nachrichtengrößenkontingents

Ich habe einen WCF-Dienst, der 1000 Datensätze aus der Datenbank an den Client zurückgibt. Ich habe einen ASP.NET WCF-Client (ich habe eine Dienstreferenz im asp.net-Webanwendungsprojekt hinzugefügt, um WCF zu verwenden).

Ich erhalte die folgende Meldung, wenn ich die Clientanwendung ausführe:

Das maximale Nachrichtengrößenkontingent für eingehende Nachrichten (65536) wurde überschritten. Verwenden Sie zum Erhöhen des Kontingents die MaxReceivedMessageSize-Eigenschaft für das entsprechende Bindungselement.

Irgendeine Hilfe? Wie erhöht man das Kontingent für Nachrichten?

441
bugBurger

In der Datei App.config oder Web.config möchten Sie, dass die Kontingente für Nachrichten in etwa so 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>

Verwenden Sie den Bindungsnamen in Ihrer Endpunktkonfiguration, z.

...
bindingConfiguration="basicHttp"
...

Die Begründung für die Werte ist einfach. Sie sind groß genug, um die meisten Nachrichten aufzunehmen. Sie können diese Nummer an Ihre Bedürfnisse anpassen. Der niedrige Standardwert dient im Wesentlichen dazu, DOS-Angriffe zu verhindern. Bei 20000000 wäre ein verteilter DOS-Angriff effektiv. Die Standardgröße von 64 KB würde eine sehr große Anzahl von Clients erfordern, um die meisten Server heutzutage zu überfordern.

580
Nate

Wenn diese Fehlermeldung während der Verwendung des WCF-Testclients weiterhin angezeigt wird, hat der Client eine separate Einstellung MaxBufferSize.

m das Problem zu beheben:

  1. Klicken Sie mit der rechten Maustaste auf den Knoten Konfigurationsdatei unten im Baum
  2. Wählen Sie Bearbeiten mit SvcConfigEditor

Eine Liste der bearbeitbaren Einstellungen wird angezeigt, einschließlich MaxBufferSize.

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

147

Wenn Sie Ihre WCF-Bindungen dynamisch erstellen, ist hier der zu verwendende Code:

BasicHttpBinding httpBinding = new BasicHttpBinding();
httpBinding.MaxReceivedMessageSize = Int32.MaxValue;
httpBinding.MaxBufferSize = Int32.MaxValue;
// Commented next statement since it is not required
// httpBinding.MaxBufferPoolSize = Int32.MaxValue;
94
Bharath K

Der WCF Test Client hat eine eigene Client-Konfiguration.

Führen Sie den Testclient aus und scrollen Sie nach unten. Wenn Sie auf den Knoten Config File doppelklicken, wird die XML-Darstellung angezeigt. Wie Sie sehen können, ist maxReceivedMessageSize65536.

Um dies zu bearbeiten, klicken Sie mit der rechten Maustaste auf den Baumknoten Config File und wählen Sie Edit With SvcConfigEditor. Wenn der Editor geöffnet wird, erweitern Sie Bindungen und doppelklicken Sie auf die Bindung, die automatisch generiert wurde.

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

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

NOTE: Deaktivieren Sie das Kontrollkästchen Immer neu generieren, wenn Sie Dienste starten .

44
Jodee Dex Page

Ich habe den einfachen Weg gefunden

--- klicke mit der rechten Maustaste auf die Konfigurationsdatei von webconfig oder app und klicke auf EDIT WCF CONFIGURATION und gehe zu bingdigs und wähle deinen Dienst aus und zeige auf der rechten Seite maxReciveMessageSize gebe eine große Zahl an ---

20
NC64

Ich löse das Problem ... wie folgt

    <bindings>
  <netTcpBinding>
    <binding name="ECMSBindingConfig" closeTimeout="00:10:00" openTimeout="00:10:00"
      sendTimeout="00:10:00" maxBufferPoolSize="2147483647" maxBufferSize="2147483647"
      maxReceivedMessageSize="2147483647" portSharingEnabled="true">
      <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
          maxStringContentLength="2147483647" maxDepth="2147483647"
          maxBytesPerRead="2147483647" />
      <security mode="None" />
    </binding>
  </netTcpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="ECMSServiceBehavior">
      <dataContractSerializer ignoreExtensionDataObject="true" maxItemsInObjectGraph="2147483647" />
      <serviceDebug includeExceptionDetailInFaults="true" />
      <serviceTimeouts transactionTimeout="00:10:00" />
      <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="100"
        maxConcurrentInstances="100" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Ich habe mein Problem mit Bing Maps WPF in meinem Projekt mithilfe von CalculateRoute () gelöst. In meinem Fall bestand die Lösung darin, die Werte für maxReceivedMessageSize und maxReceivedMessageSize für das Attribut "httpTransport" für den Abschnitt "customBinding" festzulegen.

Ich habe in der Datei applications.config (es. MyApp.config) folgende Konfiguration vorgenommen:

<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>
8
<bindings>
  <wsHttpBinding>
    <binding name="wsHttpBinding_Username" maxReceivedMessageSize="20000000"          maxBufferPoolSize="20000000">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" establishSecurityContext="false"/>
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

<client>
  <endpoint
            binding="wsHttpBinding"
            bindingConfiguration="wsHttpBinding_Username"
            contract="Exchange.Exweb.ExchangeServices.ExchangeServicesGenericProxy.ExchangeServicesType"
            name="ServicesFacadeEndpoint" />
</client>
6
Hemant Soni

Für mich musste ich nur maxReceivedMessageSize="2147483647" zur client app.config hinzufügen. Der Server blieb unberührt.

5
ashilon

Ein weiterer wichtiger Punkt, den ich aus Erfahrung berücksichtigen muss.

Ich würde dringend raten, maxBufferPoolSize NICHT zu maximieren, da Puffer aus dem Pool erst freigegeben werden, wenn die App-Domain (dh der Anwendungspool) wiederverwendet wird.

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

Weitere Details hier:

4
Valerio Gentile

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, ein komplexes Objekt mit vielen verbundenen Objekten zu übergeben (z. B. eine Baumdatenstruktur, eine Liste mit vielen Objekten ...), schlägt die Kommunikation fehl, unabhängig davon, wie Sie die Quoten 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>
4
Jacob

Vergessen Sie nicht, dass die app.config des Ausführungseinstiegspunkts berücksichtigt wird, nicht die in der Klassenbibliothek, die Web-Service-Aufrufe verwaltet, falls es eine gibt.

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

3
Gab

ich habe diesen Fehler erhalten, wenn ich diese Einstellungen in der Datei web.config verwende

System.ServiceModel.ServiceActivationException

ich setze folgende Einstellungen:

      <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>
1
FARHAD AFSAR