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

In diesem Thema werden einige empfohlene Vorgehensweisen für das Hosten von Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Diensten beschrieben.This topic outlines some best practices for hosting Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) services.

Implementieren von WCF-Diensten als DLLsImplementing WCF Services as DLLs

Die Implementierung eines WCFWCF-Diensts als DLL, die im \bin-Verzeichnis einer Webanwendung bereitgestellt wird, ermöglicht es Ihnen, den Dienst außerhalb des Webanwendungsmodells wiederzuverwenden, beispielsweise in einer Testumgebung, für die Internetinformationsdienste (IIS) möglicherweise nicht bereitgestellt wurden.Implementing a WCFWCF 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, die WCFWCF für die Zuverlässigkeit und Sicherheit auf Nachrichtenebene verwendet, nutzen den flüchtigen speicherinternen Status.The protocols WCFWCF uses for message-layer reliability and security make use of the volatile in-memory state. Zuverlässige WCFWCF-Sitzungen und -Sicherheitssitzungen können unter Umständen aufgrund von Anwendungswiederverwendungen unerwartet beendet werden.WCFWCF reliable sessions and security sessions may terminate unexpectedly due to application recycles. In IIS gehostete Anwendungen, die diese Protokolle verwenden, sollten sich beim Korrelieren des Anwendungsschichtstatus entweder nach etwas anderem als dem von WCFWCF bereitgestellten Sitzungsschlüssel richten (beispielsweise einem Anwendungsschichtkonstrukt oder einem benutzerdefinierten Korrelationsheader) oder die Wiederverwendung von IIS-Prozessen für die gehostete Anwendung deaktivieren.IIS-hosted applications that make use of these protocols should either depend on something other than the WCFWCF-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 – Instanziieren der WCFWCF -Dienstclient einmal für den Remotedienst und für mehrere wiederverwenden eingehende Anforderungen.For optimal performance in a middle-tier scenario—a service that calls out to other services in response to incoming messages—instantiate the WCFWCF service client to the remote service once and reuse it across multiple incoming requests. Im Vergleich zum Ausführen eines Dienstaufrufs für eine bereits vorhandene Clientinstanz ist die Instanziierung von WCFWCF-Dienstclients ein aufwendiger Vorgang, und Szenarien der mittleren Ebene erbringen durch das anforderungsübergreifende Caching von Remoteclients deutliche Leistungssteigerungen.Instantiating WCFWCF 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. WCFWCF-Dienstclients sind threadsicher, weshalb der Zugriff auf einen Client nicht über mehrere Threads hinweg synchronisiert werden muss. 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 WCFWCF-Dienste innerhalb einer IIS-Webfarm bereitstellen, in der ein Satz Computer einen gemeinsamen externen Namen hat (z. B. http://www.contoso.com), jedoch einzeln über einen individuellen Hostnamen adressiert wird (z. B. könnte http://www.contoso.com Datenverkehr an zwei verschiedene Computer mit den Namen http://machine1.internal.contoso.com und http://machine2.internal.contoso.com leiten).You can deploy WCFWCF 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). Dieses Bereitstellungsszenario wird vollständig von WCFWCF unterstützt. Jedoch muss die IIS-Website, die die WCFWCF-Dienste hostet, speziell konfiguriert werden, damit der richtige (externe) Hostname in den Metadaten des Diensts angezeigt wird (Web Services Description Language).This deployment scenario is fully supported by WCFWCF, but requires special configuration of the IIS Web site hosting WCFWCF services to display the correct (external) hostname in the service's metadata (Web Services Description Language).

Um sicherzustellen, dass der richtige Hostname in den von WCFWCF generierten Metadaten des Diensts angezeigt wird, konfigurieren Sie die Standardidentität für die IIS-Website, die WCFWCF-Dienste hostet, zur Verwendung eines expliziten Hostnamens.To ensure that the correct hostname appears in the service metadata WCFWCF generates, configure the default identity for the IIS Web site that hosts WCFWCF 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 Nachrichten, die an einen von IIS 6.0 und früher gehosteten WCFWCF-Dienst gesendet werden, synchron verarbeitet.By default messages sent to a WCFWCF service hosted under IIS 6.0 and earlier are processed in a synchronous manner. ASP.NET ruft in WCFWCF einen eigenen Thread (den ASP.NET-Arbeitsthread) auf, und von WCFWCF wird zum Verarbeiten der Anforderung ein anderer Thread verwendet.ASP.NET calls into WCFWCF on its own thread (the ASP.NET worker thread) and WCFWCF uses another thread to process the request. WCFWCF hält die Verbindung mit dem ASP.NET-Arbeitsthread aufrecht, bis die Verarbeitung abgeschlossen ist. 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. Die asynchrone Verarbeitung von Anforderungen schafft größere Skalierbarkeit, da so die Anzahl der zur Verarbeitung einer Anforderung erforderlichen Threads reduziert wird. Während der Verarbeitung der Anforderung wird von WCFWCF die Verbindung zum ASP.NET-Thread nicht aufrecht erhalten.Processing requests asynchronously enables greater scalability because it reduces the number of threads required to process a request –WCFWCF 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