2012-04-09 3 views
3

Ich habe eine einfache App, wo ich global.asax verwenden, um eine Serviceroute zu einem WCF-Dienst über eine benutzerdefinierte Servicehostfactory in Application_Start zuzuordnen. Der Konstruktor dieses Dienstes führt eine anfängliche Verarbeitung durch, um den Dienst einzurichten, der ein wenig Zeit benötigt.Wie erhalte ich einen Dienst, um von global.asax zu starten, ohne ihn aufzurufen?

Ich brauche diesen Konstruktor zu feuern, wenn seine serviceroute automatisch hinzugefügt wird. Ich habe versucht, einen Clientchannel von global.asax zu erstellen und einen Dummy-Aufruf zu machen, um den Dienst hochzufahren, aber ich habe festgestellt, dass der Dienst noch nicht verfügbar ist - es scheint, dass application_start zurückkehren muss.

Also wie bekomme ich den Konstruktor des Dienstes zu feuern, wenn zuerst über global.asax zugeordnet, ohne den Dienst manuell zu treffen? Leider ist AppFabric keine Option für uns, so kann ich nicht einfach zu verwenden, ist es Einbau-Autostart ..

UPDATE

ich für ein bisschen mehr Detail gefragt wurde;

Dies ist wie ein Routing-Verwaltungsdienst. Also habe ich Service1 - es wird als Serviceroute in global.asax hinzugefügt. Jetzt habe ich http://localhost/Service1

Inside Service1 Ich habe eine Methode namens 'addServiceRoute'. Wenn es aufgerufen wird, registriert es auch eine Route für Service2. Jetzt habe ich http://localhost/Service1/Service2.

Meine erste Lösung von global.asax war, eine Channelfactory zu http://localhost/service1 zu bauen, aber das würde nicht funktionieren. Service1 war noch nicht verfügbar und würde nicht kommen, bis Application_Start zurückgegeben wurde (Sie wissen immer noch nicht warum?). Also dachte ich, ich würde diesen initialen addserviceroute-Aufruf an den Konstruktor von service1 schummeln und verschieben. Hat auch nicht funktioniert.

Es wurde erwähnt, dass dies nicht im Konstruktor sein sollte - ich stimme zu, das ist nur Code testen.

Ein Singleton wurde ebenfalls erwähnt, was vielleicht in Ordnung ist, aber ich beabsichtige, mehr als eine Instanz von Service1 auf einer Maschine (im selben App-Pool) zu haben, also glaube ich nicht, dass das funktionieren wird?

** UPDATE # 2 ** Ich war für Beispielcode gefragt .. hier ist es von global.asax (ein wenig der Kürze halber getrimmt) .. So http://localhost/Test DOES kommen .. Aber wenn ich AppFabric verwenden um Test zu erwärmen und seinen Konstruktor zum feuern zu bringen, dann brauche ich nicht Test.svc oder etwas? Wie kann ich feststellen, ob dieser Service überhaupt existiert?

protected void Application_Start(object sender, EventArgs e) 
     { 
      RouteTable.Routes.Ignore("{resource}.axd/{*pathInfo}"); 
      RouteTable.Routes.Add(
       new ServiceRoute("Test", new MyServiceHostFactory(ITestService, BindingType.BasicHttpBinding, true), TestService)); 
     } 
+0

Wenn Sie ein wenig mehr Informationen hinzufügen könnten, denke ich, dass ich Ihnen helfen kann. Möchten Sie beim Start Ihres Anwendungspools eine WCF-Methode aufrufen? Was hat AppFabric damit zu tun, verwenden Sie dies für eine Art Caching? –

+0

Aktualisierung im Artikel mit Detail – XeroxDucati

+0

AppFabric hat damit zu tun, dass AppFabric mehr ist als Caching, es hilft auch, WCF-Dienste zu verwalten. Informationen zu Auto-Start finden Sie unter http://msdn.microsoft.com/en-us/library/ee677285.aspx. – Rich

Antwort

2

Was Sie beschreiben, erfordert Singleton Service (etwas, was Sie vermeiden sollten), weil normalerweise jeder Anruf oder Sitzung eine neue Instanz wird zu Konstruktor einen neuen Anruf =. Im selbst gehosteten WCF-Dienst können Sie die Singleton-Dienstinstanz instanziieren und an den Konstruktor ServiceHost übergeben. Im Fall von IIS gehosteten Dienst, der zusammen mit ServiceRoute verwendet wird, können Sie versuchen, eine eigene Klasse zu erstellen, die von ServiceHostFactory abgeleitet ist, und die erstellte Dienstinstanz als Parameter an ihren Konstruktor übergeben. Implementieren Sie in dieser Factory-Klasse die Methode CreateServiceHost, und übergeben Sie die vorhandene Dienstinstanz in den Konstruktor ServiceHost. Damit dies funktioniert, muss Ihre Serviceklasse weiterhin als singleton through service behavior behandelt werden.

Btw. Konstruktor sollte keinen zeitaufwendigen Vorgang ausführen. Konstruktor dient zum Konstruieren von Objekten, nicht zum Initialisieren von Infrastruktur. Die Verwendung von Konstruktoren für eine solche Initialisierung ist in erster Linie eine schlechte Praxis.

2

AppFabric Autostart ist was ich empfehlen würde - obwohl Sie sagen, Sie können es nicht verwenden - das ist das Problem, das es lösen sollte (Aufwärmen Sie Ihren Service).

Als Alternative vor AppFabric existierte, würden Sie Sie initialisierten in den Dienst ruft wollen verwenden müssen eine geplante Aufgabe (a.k.a Cron-Job) mit einer ausführbaren Datei, die. Die Art und Weise, wie AppFabric Autostart funktioniert, ist using named pipes (net.pipe) to trigger the warm up - aber genau das passiert, wenn der Dienst recycelt wird. Der Unterschied zwischen dem geplanten Taskansatz und dem Autostart von AppFabric besteht darin, dass der geplante Task nicht weiß, wann der Anwendungspool wiederverwendet wurde - Sie müssten Ihren Dienst regelmäßig abfragen, um ihn warm zu halten.

Alternativ können Sie Ihre WCF-Anwendung auch über Self-Hosting außerhalb von IIS hosten. Dies würde das Aufwärmproblem vermeiden, aber Sie würden nicht viele der Vorteile des von IIS gehosteten Containers erzielen. Siehe HttpSelfHostServer in the new MVC Web API oder review using a standard ServiceHost.

+0

AppFabric ist ein Problem für mich hauptsächlich, weil es nicht weiß, dass der Dienst existiert. Alles wird durch ServiceRoute erledigt, so dass die App beim Start nur eine global.asax ist, was bedeutet, appfabric weiß nicht, dass es einen Dienst zum Aufwärmen gibt .. Gibt es eine Möglichkeit, AppFabric zu erhalten, ohne dass eine SVC-Datei da ist? – XeroxDucati

+0

@XeroxDucati Sie sollten einen Beispielcode aus Ihrer 'global.asax' hinzufügen, damit wir den relevanten Kontext sehen können. – SliverNinja

+0

Hinzufügen eines Updates .. – XeroxDucati

Verwandte Themen