web-dev-qa-db-de.com

Dienst zu beschäftigt Fehler in WCF

In meinem .Net WCF-Dienst erhalte ich zeitweise die folgende Ausnahme: "Der HTTP-Dienst unter http: //MyServer/TestWCF/MyService.svc ist zu beschäftigt."

Fehlt mir hier etwas?

Benutze die einfache http-Bindung und habe die WCF-Drosselung aktiviert.

<basicHttpBinding>
        <binding name="BasicHttpBinding_MyService" maxReceivedMessageSize="2147483647"
                 messageEncoding="Text" textEncoding="utf-16" sendTimeout="00:01:00" >
          <readerQuotas maxStringContentLength="2147483647" maxArrayLength="163840000"
                        maxDepth="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
        </binding>

. . . .

<behavior name="MyWCFServices.MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceThrottling
                    maxConcurrentCalls="16"
                    maxConcurrentInstances="2147483647"
                    maxConcurrentSessions="10"/>
        </behavior>

Hilft Throttling bei der Lösung des Problems? Kann ich auch die empfohlenen Parameterwerte für Throttling für eine Website mit viel Verkehr kennen?

29
Steve Chapman

Sie könnten auf jeden Fall versuchen, die maxConcurrentSessions und maxConcurrentCalls in Ihrem Diensteinschränkungsverhalten auf die Standardwerte von 30 zu erhöhen und zu sehen, ob der Fehler dadurch behoben wird. Ein Server zu beschäftigt ist anscheinend ein Hinweis darauf, dass mehr Anforderungen eingegangen sind als der durch Ihre Dienstbeschränkung zulässige Bereich, und diese wurden verworfen, da innerhalb des angegebenen Zeitlimits keine Dienstinstanz zur Verfügung stand, um sie zu bedienen.

10
marc_s

Meine Antwort wäre, ob der App-Pool gut läuft?

Ich habe gesehen, dass dieser Fehler aufgetreten ist, wenn der App-Pool aufgrund von Ausnahmen, die nicht abgefangen werden, gestorben ist.

Betrachten Sie beispielsweise benutzerdefinierte Konfigurationsabschnitte. Wenn ein Fehler vorhanden ist, schlägt die App fehl, bevor sie überhaupt gestartet wird. Zu viele davon in kurzer Zeit töten den App-Pool.

9
Adam C.

Wenn Ihr Dienst unter Ihrem Konto ausgeführt wird (Identität), ist es durchaus möglich, dass Sie Ihr Kennwort kürzlich geändert haben. Sie müssen es für den Anwendungspool IIS in Erweiterte Einstellungen | zurücksetzen Dialogfeld "Identität".

4
Mark Bergan

Es sind nicht nur die maxConcurrentSessions, sondern auch die Dauer der Sitzung.

Wenn der Client die Verbindung nicht schließt, bleibt er bis zum Timeout geöffnet. Sie könnten dann die maxConcurrentSessions-Grenze mit sehr geringer Aktivität auf dem Server erreichen.

2
Shiraz Bhaiji

Stellen Sie sicher, dass Sie auch die innere Ausnahme überprüfen. Während unserer Bereitstellungen deaktivieren wir den Anwendungspool eines WCF-Webdiensts, und die Clients erhalten während dieser Zeit diesen Fehler:

System.ServiceModel.ServerTooBusyException: Der HTTP-Dienst unter https://ourserver.x.com/path/service.svc ist zu beschäftigt. ---> System.Net.WebException: Der Remote-Server hat einen Fehler zurückgegeben: (503) Server nicht verfügbar.

In diesem Fall wird also ein HTTP-Fehler 503 als "Server zu beschäftigt" interpretiert.

2
ALEXintlsos

Ich bin gerade auf diesen Fehler gestoßen und es ging auf ein einfaches Konfigurationsproblem zurück. Ich hatte einen Dienst auf dem gleichen Port und der gleichen Schnittstelle (Mock-Service). Ich habe den Dienst mit der entsprechenden Befehlszeilenoption ausgeführt, um den von mir beabsichtigten "ursprünglichen" Dienst auszuführen. Der Fehler ging weg.

1

Die einzige Quelle für diese Ausnahme ist mir bekannt, wenn Sie Sitzungen verwenden und die MaxPendingChannels-Drossel erreichen. Der Standardwert ist etwas niedriger als 4. Sie könnten versuchen, sie höher einzustellen (z. B. 128). Wenn Sie nur eine Reproduktion durchführen möchten, setzen Sie sie auf 1, und Sie sollten sie unter Belastungstest sehen.

Weitere Informationen zu Sitzungen finden Sie hier: http://msdn.Microsoft.com/en-us/library/ms733795.aspx

1
krisragh MSFT

Meine Lösung wäre, Überprüfen Sie die App.Config-Datei, ob die Service-Tag-Nummer für diesen bestimmten Dienst vorhanden ist. 

z.B:

<service name="MyServices.ServiceName">
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="TestBinding"   contract="MyServices.ServiceName">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <Host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/MyServices/ServiceName/" />
          </baseAddresses>
        </Host>
</service>
0
Arun Kumar T