WCF REST Service in den Ruhezustand nach Inaktivität
Ich habe einen WCF REST service deklariert ist, in eine regelmäßige ASP.NET web-Projekt:
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, IncludeExceptionDetailInFaults = true)]
public class BasicApp
Verwende ich es als eine service-Schicht für ein iPhone-app, die ich Baue, also bin ich es anfordern mit den hervorragenden ASIHTTPRequest-Bibliothek.
Den Dienst selbst funktioniert ganz gut, aber wenn es im Leerlauf für etwa 10 Minuten, der service scheint zu schlafen, die in das Ende gibt mir die timeout-Probleme auf dem iPhone.
Wenn ich die service-Anfrage über den browser ist es das gleiche, aber nach 30 Sekunden oder so den Dienst "aufwacht" und dann alle aufeinander folgenden Anfragen werden wirklich schnell. Ich weiß, ich kann die timeout-limit auf dem iPhone, aber das scheint nicht wirklich zu funktionieren sehr gut für ein handheld-Gerät.
Ich vermute, es ist ein Konfigurationsproblem. Der service gehostet wird, auf Win2008R2 mit IIS 7.5
IIS-website so konfiguriert ist, mit dem eigenen AppPool läuft .NET framework v4 mit Integrierter Pipeline.
Jemand eine Idee, wie man dieses Problem beheben?
InformationsquelleAutor Peter Lindholm | 2011-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Anwendungspool hostet Ihr service definiert Idle-Timeout-Eigenschaft (erweiterte Einstellungen der app pool in der IIS management console), die standardmäßig auf 20 Minuten. Wenn kein Antrag eingegangen ist, die von der app-pool in idle-timeout der worker-Prozesse dienen der pool ist beendet. Nach Erhalt einer neuen Anfrage der IIS müssen den Vorgang neu starten, der Vorgang muss Lasteinleitung domain und alle zugehörigen Assemblys zu kompilieren .die svc-Datei, führen Sie die service-host und Bearbeitung der Anfrage.
Kann die Lösung auch in die Erhöhung der idle-time-out, aber die Bedeutung dieses time-out ist für die korrekte Handhabung von server-Ressourcen. Wenn der Prozess ist nicht erforderlich, es sollte gestoppt werden. Ein weiterer hässlicher workaround ist mit einigen ping-Prozess (z.B. cron-job oder geplanten task auf dem server), die regelmäßig ping-Aufruf einer Methode, die auf den Dienst oder die Seite in der gleichen Anwendung.
Edit: Diese Antwort ist obsolet, es wurde geschrieben für alte IIS-Versionen, bei denen "AlwaysRunning" - option war nicht verfügbar. Bitte überprüfen Sie die anderen Antworten.
"Die Lösung kann in die Erhöhung der idle-time-out, aber die Bedeutung dieses time-out ist für die korrekte Handhabung von server-Ressourcen. Wenn der Prozess ist nicht erforderlich, es sollte gestoppt werden." Ich kann Sie nicht einfach akzeptieren. was ist, wenn es 10 Minuten dauert das laden meine service? was, wenn ich haben rechtliche Verpflichtungen für Leistung? Was ist mit Cache-Daten? Das hässliche Ding ist kein workaround, das ist die Ansatz, dass die Programmierer\sysadmin nicht wissen, was die beste Lösung für seine spezifischen Szenario.
InformationsquelleAutor Ladislav Mrnka
Nicht brauchen, um ping auf Ihrem server, hier ist ein screenshot von der Einstellung unter erweiterte Einstellungen für den Anwendungspool. Ändern Sie Start-Modus AlwaysRunning und es wird aufhören zu schlafen.
tatsächlich, es ist erhältlich in 7,5, nur versteckt in der applicationHost.config.
InformationsquelleAutor artfulhacker
Diesem erzählt Sie, wie Sie festlegen, autostart, Ihre in der applicationHost.config-Einstellungen für Ihre appPool
http://msdn.microsoft.com/en-us/library/ee677260.aspx
Hinzugefügt, der Vollständigkeit halber
C:\Windows\System32\inetsrv\config\applicationHost.config
InformationsquelleAutor Monsters X
Da Sie mit IIS 7.5 kann man wiederum auf die Anwendung auto-start auf Ihrer webapp, dadurch wird sichergestellt, dass der service bleibt "lebendig".
--larsw
InformationsquelleAutor larsw
Hier ist ein Kompromiss zwischen dem erstellen von selbst-gehostete WCF-windows-Dienst und deaktivieren AppPool Leerlauf timeaout und recycling-Eigenschaften und Pingen service jede minute.
Gibt es 2 events.
5074 - IIS Application Pool Recycling
5186 - IIS Application Pool Recycling
Ist es möglich, fügen Sie Ereignishandler (PowerShell-Skript ausführen) für diese Arten von Veranstaltungen. Hier beschrieben: Trigger ein PowerShell-Skript von einem Windows-Ereignis
PowerShell-Skript:
So, jedes mal, wenn Sie Ihre IIS-hosted service "schlafen", Sie sanft aufwecken.
InformationsquelleAutor aleha
artfulhacker habe es korrekt. Die Umschaltung der startMode zu AlwaysRunning erlaubt der web-Dienst um immer live sein. Wir verwenden von IIS mit AAR/Server-Farmen (load balancing.
Hier ist ein screen shot von der startMode Einstellung in IIS6/WinServer 2003.
InformationsquelleAutor DanFredell