Empfohlene Vorgehensweisen für das Hosten in InternetinformationsdienstenInternet Information Services Hosting Best Practices

Dieses Thema beschreibt einige bewährten Methoden für das Hosten von Windows Communication Foundation (WCF)-Dienste an.This topic outlines some best practices for hosting Windows Communication Foundation (WCF) services.

Implementieren von WCF-Diensten als DLLsImplementing WCF Services as DLLs

Implementieren einen WCF ermöglicht Dienst als eine DLL, die in das Verzeichnis "\bin" einer Webanwendung bereitgestellt wird, dass Sie den Dienst außerhalb des webanwendungsmodells, z. B. in einer testumgebung wiederverwenden, die möglicherweise keine Internet Information Services (IIS) bereitgestellt.Implementing a WCF service as a DLL that is deployed to the \bin directory of a Web application allows you reuse the service outside of the Web application model, for example, in a test environment that may not have Internet Information Services (IIS) deployed.

Diensthosts in IIS-gehosteten AnwendungenService Hosts in IIS-Hosted Applications

Verwenden Sie keine imperativen Selbsthosting-APIs zur Erstellung neuer Diensthosts, die bei Netzwerktransporten lauschen, die nicht systemseitig von der IIS-Hostumgebung unterstützt werden (z. B. IIS 6.0IIS 6.0 zum Hosten von TCP-Diensten, da die TCP-Kommunikation nicht systemseitig von IIS 6.0IIS 6.0 unterstützt wird).Do not use the imperative self-host APIs to create new service hosts that listen on network transports not natively supported by the IIS hosting environment (For example, IIS 6.0IIS 6.0 to host TCP services, because TCP communication is not natively supported on IIS 6.0IIS 6.0). Diese Vorgehensweise ist nicht empfehlenswert.This approach is not recommended. Imperativ erstellte Diensthosts sind innerhalb der IIS-Hostumgebung nicht bekannt.Service hosts created imperatively are not known within the IIS hosting environment. Die Schwierigkeit liegt darin, dass Verarbeitungen, die von imperativ erstellten Diensten ausgeführt werden, von IIS bei der Ermittlung, ob der Hostanwendungspool im Leerlauf ist, nicht berücksichtigt werden.The critical point is that processing done by imperatively created services is not accounted for by IIS when it determines whether the hosting application pool is idle. Das Ergebnis ist, dass Anwendungen, die über solche imperativ erstellten Diensthosts verfügen, sich in einer IIS-Hostumgebung befinden, die IIS-Hostprozesse aggressiv freigibt.The result is that applications that have such imperatively created service hosts have an IIS hosting environment that aggressively disposes of IIS host processes.

URIs und IIS-gehostete EndpunkteURIs and IIS-Hosted Endpoints

Endpunkte für einen IIS-gehosteten Dienst sollten mit relativen URIs (Uniform Resource Identifier) statt mit absoluten Adressen konfiguriert werden.Endpoints for an IIS-hosted service should be configured using relative Uniform Resource Identifiers (URIs), not absolute addresses. Dadurch wird sichergestellt, dass die Endpunktadresse innerhalb des Satzes von URI-Adressen liegt, die zur Hostanwendung gehören und dafür sorgen, dass die nachrichtenbasierte Aktivierung wie erwartet ausgeführt wird.This guarantees that the endpoint address falls within the set of URI addresses that belong to the hosting application and ensures that message-based activation happens as expected.

Zustandsverwaltung und ProzesswiederverwendungState Management and Process Recycling

Die IIS-Hostumgebung ist für Dienste optimiert, die keinen lokalen Zustand im Arbeitsspeicher speichern.The IIS hosting environment is optimized for services that do not maintain local state in memory. IIS verwendet den Hostprozess als Reaktion auf verschiedene externe und interne Ereignisse wieder, was dazu führt, dass Daten, die ausschließlich im Arbeitsspeicher im flüchtigen Zustand gespeichert werden, verloren gehen.IIS recycles the host process in response to a variety of external and internal events, causing any volatile state stored exclusively in memory to be lost. In IIS gehostete Dienste sollten ihren Status prozessextern speichern (beispielsweise in einer Datenbank) oder in einem speicherinternen Cache, der einfach wiederhergestellt werden kann, wenn ein Wiederverwendungsereignis für eine Anwendung eintritt.Services hosted in IIS should store their state external to the process (for example, in a database) or in an in-memory cache that can easily be re-created if an application recycle event occurs.

Hinweis

Die Protokolle für nachrichtenebenen-Zuverlässigkeit und Sicherheit WCF vornehmen Verwenden des flüchtigen speicherinternen Status.The protocols WCF uses for message-layer reliability and security make use of the volatile in-memory state. Zuverlässige WCF--Sitzungen und-sicherheitssitzungen möglicherweise aufgrund von anwendungswiederverwendungen unerwartet beendet.WCF reliable sessions and security sessions may terminate unexpectedly due to application recycles. IIS-gehosteten Anwendungen stellen diese Protokolle verwenden entweder auf einen anderen Wert als den bereitgestellten WCF Sitzungsschlüssel für das Korrelieren von Anwendungsschicht Status (z. B. eine Anwendung oder einem benutzerdefinierten korrelationsheader) oder deaktivieren abhängen sollen IIS-Prozess für die gehostete Anwendung wiederverwenden.IIS-hosted applications that make use of these protocols should either depend on something other than the WCF-provided session key for correlating application-layer state (for example, an application-layer construct or custom correlation header) or disable IIS process recycling for the hosted application.

Optimieren der Leistung in Szenarien der mittleren EbeneOptimizing Performance in Middle-Tier Scenarios

Für eine optimale Leistung einer Szenario der mittleren Ebene– ein Dienst, der Reaktion auf eingehende Nachrichten andere Dienste aufruft – einmal, die WCF-Dienst-Client an den Remotedienst zu instanziieren und diesen über mehrere eingehende wiederverwenden, Anforderungen.For optimal performance in a middle-tier scenario—a service that calls out to other services in response to incoming messages—instantiate the WCF service client to the remote service once and reuse it across multiple incoming requests. Instanziieren von WCF-Webdienstclients ist ein teurer Vorgang relativ zum Erstellen eines Diensts in einer bereits vorhandene Clientinstanz aufrufen und Szenarien der mittleren Ebene erzeugen deutliche Leistungssteigerungen durch Remoteclients anforderungsübergreifend Zwischenspeichern.Instantiating WCF service clients is an expensive operation relative to making a service call on a pre-existing client instance, and middle-tier scenarios produce distinct performance gains by caching remote clients across requests. WCF-Dienstclients sind threadsicher, daher ist es nicht notwendig, die Zugriff auf einen Client über mehrere Threads hinweg synchronisiert.WCF service clients are thread-safe, so it is not necessary to synchronize access to a client across multiple threads.

Szenarien der mittleren Ebene erzeugen außerdem Leistungssteigerungen durch Verwendung von asynchronen, von der svcutil /a-Option generierten APIs.Middle-tier scenarios also produce performance gains by using the asynchronous APIs generated by the svcutil /a option. Die /a -Option bewirkt, dass die ServiceModel Metadata Utility Tool (Svcutil.exe) generieren BeginXXX/EndXXX Methoden für jeden Dienstvorgang, wodurch potenziell langer Aufrufe Remotedienste auf vorgenommen werden Hintergrundthreads ausgeführt.The /a option causes the ServiceModel Metadata Utility Tool (Svcutil.exe) to generate BeginXXX/EndXXX methods for each service operation, which allows potentially long-running calls to remote services to be made on background threads.

WCF in Szenarien mit mehreren Adressen oder mehreren NamenWCF in Multi-Homed or Multi-named scenarios

Sie können WCF-Dienste innerhalb einer IIS-Webfarm, eine Gruppe von Computern freigeben, in einen gemeinsamen externen Namen bereitstellen (z. B. http://www.contoso.com) jedoch einzeln von Hostnamen adressiert wird (z. B. http://www.contoso.com möglicherweise Weiterleitung von Datenverkehr an zwei verschiedenen Computern mit dem Namen http://machine1.internal.contoso.com und http://machine2.internal.contoso.com).You can deploy WCF services inside of an IIS Web farm, where a set of computers share a common external name (such as http://www.contoso.com) but are individually addressed by different hostnames (for example, http://www.contoso.com might direct traffic to two different machines named http://machine1.internal.contoso.com and http://machine2.internal.contoso.com). Bei diesem Bereitstellungsszenario wird vollständig von WCF unterstützt, erfordert jedoch spezielle Konfiguration für die IIS-Website zum Hosten von WCF-Diensten für der richtige (externe) Hostname in den Dienstmetadaten (Web Services Description Language) angezeigt.This deployment scenario is fully supported by WCF, but requires special configuration of the IIS Web site hosting WCF services to display the correct (external) hostname in the service's metadata (Web Services Description Language).

Um sicherzustellen, dass der richtige Hostname in den Dienstmetadaten WCF wird generiert, konfigurieren die Standardidentität für die IIS-Website, die WCF-Diensten für die Verwendung eines expliziten Hostnamens hostet.To ensure that the correct hostname appears in the service metadata WCF generates, configure the default identity for the IIS Web site that hosts WCF services to use an explicit hostname. Z. B. Computer, die innerhalb der Webfarm www.contoso.com befinden zu verwendende eine IIS-sitebindung *: 80: www.contoso.com für HTTP und *: 443:www.contoso.com für HTTPS.For example, computers that reside inside of the www.contoso.com farm should use an IIS site binding of *:80:www.contoso.com for HTTP and *:443:www.contoso.com for HTTPS.

Sie können IIS-Websitebindungen konfigurieren, indem Sie das IIS-Snap-In der Microsoft Management Console (MMC) verwenden.You can configure IIS Web site bindings by using the IIS Microsoft Management Console (MMC) snap-in.

Anwendungspools, die in unterschiedlichen Benutzerkontexten ausgeführt werden, überschreiben Assemblys anderer Konten im temporären Ordner.Application Pools Running in Different User Contexts Overwrite Assemblies from Other Accounts in the Temporary Folder

Um sicherzustellen, dass Anwendungspools, die in unterschiedlichen Benutzerkontexten ausgeführt werden, keine Assemblys anderer Konten im temporären ASP.NETASP.NET-Dateiordner überschreiben können, verwenden Sie unterschiedliche Identitäten und unterschiedliche Ordner für unterschiedliche Anwendungen.To ensure that application pools running in different user contexts cannot overwrite assemblies from other accounts in the temporary ASP.NETASP.NET files folder, use different identities and temporary folders for different applications. Wenn Sie beispielsweise zwei virtuelle Anwendungen /Application1 und /Application2 haben, können Sie zwei Anwendungspools (A und B) mit zwei unterschiedlichen Identitäten erstellen.For example, if you have two virtual applications /Application1 and / Application2, you can create two Application pools, A and B, with two different identities. Der Anwendungspool A kann unter einer Benutzeridentität ausgeführt werden (user1), während der Anwendungspool B unter einer anderen Benutzeridentität (user2) ausgeführt wird. Konfigurieren Sie /Application1 zur Verwendung von A und /Application2 zur Verwendung von B.Application pool A can run under one user identity (user1) while application pool B can run under another user identity (user2), and configure /Application1 to use A and /Application2 to use B.

In der Datei "Web.config", können Sie konfigurieren, den temporären Ordner mit < system.web/compilation/@tempFolder>.In Web.config, you can configure the temporary folder using <system.web/compilation/@tempFolder>. Für/Application1 kann es "c:\tempForUser1" sein kann, und für/application2 kann es "c:\tempForUser2" sein.For /Application1, it can be "c:\tempForUser1" and for application2 it can be "c:\tempForUser2". Gewähren Sie den beiden Identitäten die entsprechende Schreibberechtigung für diese Ordner.Grant corresponding write permission to these folders for the two identities.

Dann kann user2 den Codegenerierungsordner für /application2 (unter c:\tempForUser1) nicht ändern.Then user2 cannot change the code-generation folder for /application2 (under c:\tempForUser1).

Aktivieren der asynchronen VerarbeitungEnabling asynchronous processing

Standardmäßig werden an einen unter IIS 6.0 und früher gehosteten WCF-Dienst gesendete Nachrichten synchron verarbeitet.By default messages sent to a WCF service hosted under IIS 6.0 and earlier are processed in a synchronous manner. ASP.NET ruft in WCF in einem eigenen Thread (den ASP.NET-Arbeitsthread) und WCF verwendet einen anderen Thread zum Verarbeiten der Anforderung.ASP.NET calls into WCF on its own thread (the ASP.NET worker thread) and WCF uses another thread to process the request. WCF hält die Verbindung zum ASP.NET-Arbeitsthread aufrecht, bis die Verarbeitung abgeschlossen ist.WCF holds onto the ASP.NET worker thread until it completes its processing. Dies hat die synchrone Verarbeitung von Anforderungen zur Folge.This leads to synchronous processing of requests. Verarbeitung von Anforderungen schafft ermöglicht größere Skalierbarkeit, das er reduziert die Anzahl der Threads zum Verarbeiten einer Anforderung, die – WCF nicht zum ASP.NET-Thread aufrecht beim Verarbeiten der Anforderung erhalten werden erforderlich.Processing requests asynchronously enables greater scalability because it reduces the number of threads required to process a request –WCF does not hold on to the ASP.NET thread while processing the request. Verwendung des asynchronen Verhaltens wird nicht empfohlen, für Computer mit IIS 6.0, da es keine Möglichkeit für die Beschränkung von eingehender Anforderungen, die Sicherung des Servers zu öffnen Denial-Of-Service- -Angriffe (DOS).Use of asynchronous behavior is not recommended for machines running IIS 6.0 because there is no way to throttle incoming requests that open up the server to Denial Of Service (DOS) attacks. Beginnend mit IIS 7.0, eine gleichzeitige Anforderungen Drosselung wurde eingeführt: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0]"MaxConcurrentRequestsPerCpu.Starting with IIS 7.0, a concurrent request throttle has been introduced: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0]"MaxConcurrentRequestsPerCpu. Aufgrund dieser neuen Drosselung kann die asynchrone Verarbeitung nun gefahrlos eingesetzt werden.With this new throttle it is safe to use the asynchronous processing. In IIS 7.0 werden der asynchrone Handler und das Modul standardmäßig registriert.By default in IIS 7.0, the asynchronous handler and module are registered. Wenn dies deaktiviert wurde, können Sie die asynchrone Verarbeitung von Anforderungen in der Datei Web.config der Anwendung manuell aktivieren.If this has been turned off, you can manually enable asynchronous processing of requests in your application's Web.config file. Die verwendeten Einstellungen richten sich nach Ihrer aspNetCompatibilityEnabled-Einstellung.The settings you use depend on your aspNetCompatibilityEnabled setting. Wenn aspNetCompatibilityEnabled auf false festgelegt ist, konfigurieren Sie System.ServiceModel.Activation.ServiceHttpModule wie im folgenden Konfigurationsausschnitt dargestellt.If you have aspNetCompatibilityEnabled set to false, configure the System.ServiceModel.Activation.ServiceHttpModule as shown in the following configuration snippet.

<system.serviceModel>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="false" />      
  </system.serviceModel>  
  <system.webServer>  
    <modules>  
      <remove name="ServiceModel"/>  
      <add name="ServiceModel"   
           preCondition="integratedMode,runtimeVersionv2.0"   
           type="System.ServiceModel.Activation.ServiceHttpModule, System.ServiceModel,Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>  
    </modules>  
    </system.webServer>  

Wenn aspNetCompatibilityEnabled auf true festgelegt ist, konfigurieren Sie System.ServiceModel.Activation.ServiceHttpHandlerFactory wie im folgenden Konfigurationsausschnitt dargestellt.If you have aspNetCompatibilityEnabled set to true, configure the System.ServiceModel.Activation.ServiceHttpHandlerFactory as shown in the following config snippet.

<system.serviceModel>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />      
  </system.serviceModel>  
  <system.webServer>  
    <handlers>  
          <clear/>  
          <add name="TestAsyncHttpHandler"   
               path="*.svc"   
               verb="*"   
               type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"           
               />  
    </handlers>      
  </system.webServer>  

Siehe auchSee Also

Dienst-Hosting-BeispieleService Hosting Samples
Windows Server AppFabric-HostingfunktionenWindows Server App Fabric Hosting Features