wake-up-neo.com

IIS WCF-Diensthosting gegen Windows-Dienst

Wir haben einen WCF-Service entwickelt und wollen ihn implementieren . Unsere Kunden werden ihn mit basicHttpBinding verwenden, aber unser internes Team wird ihn mit namedPipesBinding verwenden.

Wir fragen uns, ob es besser ist, es in IIS 7 oder mit einem Windows-Dienst zu hosten. Wir haben einige Tests durchgeführt und festgestellt, dass beim Hinzufügen von Bindungen in IIS die Konfiguration nicht aktualisiert wird Datei unseres Dienstes. Das bedeutet, dass wir die Konfiguration an zwei verschiedenen Stellen beibehalten müssen. Es ist nicht logisch, richtig?

Wir lesen auch in StackOverflow, dass die Basisadresse ignoriert wird, wenn ein WCF-Dienst Host in IIS ist (siehe WCF-Dienstkonfigurationsdatei zu <baseAddresses> ). 

45
esylvestre

Um diese Frage zu beantworten:

Wir haben ein paar Tests gemacht und herausgefunden. das, wenn wir Bindungen in .__ hinzufügen. IIS aktualisiert die Konfigurationsdatei von .__ nicht. unser Service. Das bedeutet, dass wir Sie müssen die Konfiguration in .__ beibehalten. zwei verschiedene orte. Es ist keine Logik, Recht ?

Wenn Sie IIS zum Hosten Ihres Dienstes verwenden, müssen Sie Ihre App.config-Datei oder Ihre web.config-Datei so konfigurieren, dass IIS eine Bindung freigibt. In Ihre Konfigurationsdatei werden Sie also Ihre gesamte Bindung einfügen Sie erlauben zu Ihrem WCF-Dienst. Http, net.tcp etc ...

In Ihrer Bindung werden Sie keine Adresse angegeben, da Sie diese Adresse direkt in IIS angeben.

In IIS müssen Sie die Bindung zulassen, die in den erweiterten Einstellungen Ihrer Website verfügbar ist. Danach legen Sie eine neue Bindung für den Webservice Ihrer Website fest, fügen alle Bindungen hinzu, die Sie hören möchten, und geben die Adresse an.

Sie geben die Adresse direkt in IIS an.

Es gibt ein Beispiel.

Ihre Konfigurationsdatei:

<services>
    <service name="ServiceName">                    
        <endpoint address=""
            binding="basicHttpBinding"
            bindingConfiguration="httpMode"
            contract="IContract" />                 
        <endpoint address=""
            binding="netTcpBinding"
            contract="IContract" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
</services>

In Ihrer IIS Einstellung wird Ihr Wille eingefügt 

http, net.tcp in aktivierten Protokollen

Danach gehen Sie in Ihre Bindung in IIS ein. Legen Sie Ihre Bindung für http normaly ein und fügen Sie eine neue Bindung net.tcp hinzu. In der Bindungskonfiguration setzen Sie den Port und das virtuelle Verzeichnis wie 

8001: *

Diese Einstellung erlaubt alle Verbindungen zum 8001-Port für jedes virtuelle Verzeichnis.

Sie müssen außerdem die Funktion "WCF-Aktivierung (HTTP-Aktivierung und Nicht-HTTP-Aktivierung") auf Ihrem Server installiert haben.

11
Cédric Boivin

Das Hosting in IIS hat viele Vor- und Nachteile.

Ja, IIS gibt Ihnen das Laden nach Bedarf - dies kann ein Plus oder ein Minus sein. Wenn eine Anforderung eingeht, wird der ServiceHost erstellt, die gehostete Serviceklasse wird instanziiert und die Anforderung wird verarbeitet. Nichts muss rund um die Uhr laufen. Gleichzeitig erfordert dieses Setup jedoch immer mehr Zeit und Mühe, wenn eine Nachricht eingeht, und Sie als Programmierer haben nicht wirklich viel Kontrolle über Ihren Service-Host. 

Und ja, mit IIS definiert das virtuelle Verzeichnis, in dem sich die * .svc-Datei befindet, Ihre Adresse. Alle Basisadressen oder explizit definierten Adressen in Ihrer Konfiguration werden nicht berücksichtigt. Und ohne großen Aufwand können Sie das Layout der Dienstadressen nicht ändern. Sie werden immer http: //servername/virtualdirectory/YourService.svc (einschließlich der Erweiterung .svc) sein.

Self-Hosting ist oft schneller, da Ihr ServiceHost bereits betriebsbereit ist. Sie müssen jedoch sicherstellen, dass das ServiceHost wirklich betriebsbereit ist. Es gibt kein "On-Demand" -Laden, wenn eine Nachricht eingeht kann die Anfrage bearbeiten oder nicht. Sie haben jedoch viel mehr Kontrolle über den Service-Host - wann und wie er erstellt wird usw., und Sie können Ihre Service-Adressen nach Ihren Wünschen auswählen und definieren.

Ich persönlich würde fast immer Self-Hosting wählen - in einer Konsolen-App zum Testen, in einem NT-Service für die Produktion. Für mich scheint es der passendere Weg zu sein, und der kontrolliertere Weg auch. Sie müssen mehr arbeiten - aber Sie wissen genau, was Sie tun.

Marc

75
marc_s

marc_s gibt normalerweise großartige Antworten, mit denen ich vollkommen übereinstimme, aber in diesem Fall nicht.
Selbsthosting von WCF ist keine gute Idee, insbesondere mit den Dublin-Technologien, die in Kürze von Microsoft veröffentlicht werden. Die Verwaltung und der Betrieb von WCF- (und WF-) Anwendungen sind wesentlich einfacher, wenn sie in IIS gehostet werden. 

Zusätzlich erhalten Sie die On-Demand-Beladung. 

Für IIS7.5 (WS2008 R2) gibt es eine Always-On-Option. 

Sie können die URL auch leicht umschreiben, um die .svc-Datei wegzulassen, wenn Sie dadurch gestört werden. 

26
Cheeso

Interessantes Tidbit-> Nachdem ich diesen Thread gelesen hatte, stieß ich in der MSDN auf diese Worte über das Hosten eines WCF-Dienstes mit einem Windows-Dienst:

Im Folgenden sind einige der Nachteile von Windows-Diensten aufgeführt: 

• Bereitstellung: Dienste müssen mit dem .NET Framework-Dienstprogramm Installutil.exe oder über eine benutzerdefinierte Aktion in einem Installationspaket installiert werden.
• Eingeschränkte Funktionen: Windows-Dienste verfügen nach wie vor über eine begrenzte Anzahl an einsatzbereiten Funktionen, um Hochverfügbarkeit, einfache Verwaltbarkeit, Versionsverwaltung und Bereitstellungsszenarien zu unterstützen. Im Wesentlichen müssen Sie diese Anforderungen selbst durch benutzerdefinierten Code abdecken, während IIS standardmäßig mit einigen dieser Funktionen ausgestattet ist. Windows-Dienste bieten Wiederherstellbarkeit und einige Sicherheitsfunktionen, Sie müssen jedoch noch einige Arbeiten selbst erledigen.
http://msdn.Microsoft.com/en-us/library/bb332338.aspx

... und der folgende Link:

Hosting-Dienste: (Nizza Vergleichstabelle)
http://msdn.Microsoft.com/de-de/library/ms730158.aspx

16
atconway

Auf diese Frage gibt es keine Standardantwort. Ich stimme der Antwort von Cheeso nicht zu (Selbsthosting von WCF ist keine gute Idee).

Überprüfen Sie die folgenden Links: ( http://msdn.Microsoft.com/en-us/library/ms730158.aspx , http://msdn.Microsoft.com/en-us/library/bb332338. aspx ) und überlege dir deine Einschränkungen:

  • operatives System
  • erwartete Leistung
  • verfügbares HW
  • erwartete Verfügbarkeit

und Sie werden sehen, dass "Self-Hosting" in vielen Situationen die beste Alternative ist.

7
Rafa

IIS bietet eine Vielzahl von sofort einsatzbereiten Funktionen, z. B. das Neuladen von App-Domänen, Überwachung usw.

Deshalb sollten Sie diese Fragen zuerst beantworten: Benötigen Sie alle diese Funktionen oder nicht? Wenn nicht - Windows-Dienst kann in Betracht gezogen werden.

5

Obwohl hier eine Antwort ausgewählt wurde, erlaube ich mir, einen Q/A-Thread-Link zu veröffentlichen. 

Wie konfiguriere ich den WCF-Dienst aus dem Code, wenn er in IIS gehostet wird?

Was Sie in meiner Antwort (und dem Link darin) finden, ist Ihre genaue Kontrolle über den Dienst Host, ob Sie ihn in WService oder in IIS laden.

Beim Start des Dienstes können Sie IIS abfragen, welche Bindungen vorhanden sind, und die entsprechenden Endpunkte erstellen. Suchen Sie nach der IIs-Konfiguration im Microsoft.Web.Administration-Namespace. 

Hoffe das hilft ein bisschen.

0
ChristoD