Sdílet prostřednictvím


Doporučené postupy hostování Internetové informační služby

Toto téma popisuje některé osvědčené postupy pro hostování služeb WCF (Windows Communication Foundation).

Implementace služeb WCF jako knihoven DLL

Implementace služby WCF jako knihovny DLL nasazené do adresáře \bin webové aplikace umožňuje opakovaně používat službu mimo model webové aplikace, například v testovacím prostředí, které nemusí mít nasazené Internetová informační služba (IIS).

Hostitelé služeb v aplikacích hostovaných službou IIS

Nepoužívejte imperativní rozhraní API pro vlastní hostitele k vytvoření nových hostitelů služeb, kteří naslouchají síťovým přenosům, které nejsou nativně podporovány hostitelským prostředím služby IIS (například služba IIS 6.0 pro hostování služeb TCP, protože komunikace TCP není nativně podporována ve službě IIS 6.0). Tento přístup se nedoporučuje. Hostitelé služeb vytvořené imperativním způsobem nejsou v hostitelském prostředí služby IIS známi. Kritickým bodem je, že zpracování provedené imperativními vytvořenými službami se službou IIS nepočítá, když určí, jestli je hostitelský fond aplikací nečinný. Výsledkem je, že aplikace, které mají takové imperativní vytvořené hostitele služby, mají hostitelské prostředí služby IIS, které agresivně odstraňuje hostitelské procesy služby IIS.

Identifikátory URI a koncové body hostované službou IIS

Koncové body pro službu hostovanou službou IIS by měly být nakonfigurované pomocí relativních identifikátorů URI (Uniform Resource Identifier), nikoli absolutních adres. To zaručuje, že adresa koncového bodu spadá do sady adres URI, které patří do hostitelské aplikace, a zajišťuje, že aktivace na základě zpráv proběhne podle očekávání.

Správa stavu a recyklace procesů

Hostitelské prostředí služby IIS je optimalizované pro služby, které neudržují místní stav v paměti. Služba IIS recykluje hostitelský proces v reakci na řadu externích a interních událostí, což způsobuje ztrátu jakéhokoli nestálého stavu uloženého výhradně v paměti. Služby hostované ve službě IIS by měly ukládat svůj stav mimo proces (například v databázi) nebo do mezipaměti v paměti, která se dá snadno znovu vytvořit, pokud dojde k recyklování aplikace.

Poznámka:

Protokoly WCF používají spolehlivost a zabezpečení vrstvy zpráv, které využívají nestálý stav v paměti. Spolehlivé relace WCF a relace zabezpečení se můžou neočekávaně ukončit z důvodu recyklace aplikací. Aplikace hostované službou IIS, které používají tyto protokoly, by měly buď záviset na něčem jiném než klíč relace poskytované WCF pro korelaci stavu aplikační vrstvy (například konstruktoru aplikační vrstvy nebo vlastní hlavičky korelace), nebo zakázat recyklaci procesů IIS pro hostované aplikace.

Optimalizace výkonu ve scénářích střední vrstvy

Pro zajištění optimálního výkonu ve scénáři střední vrstvy – služba, která v reakci na příchozí zprávy volá jiné služby – vytvoří instanci klienta služby WCF do vzdálené služby jednou a znovu ji použije pro více příchozích požadavků. Vytváření instancí klientů služby WCF je náročná operace vzhledem k volání služby u již existující instance klienta a scénáře střední vrstvy vytvářejí jedinečné zvýšení výkonu díky ukládání vzdálených klientů do mezipaměti mezi požadavky. Klienti služby WCF jsou bezpečné pro přístup z více vláken, takže není nutné synchronizovat přístup k klientovi ve více vláknech.

Scénáře střední vrstvy také vytvářejí zvýšení výkonu pomocí asynchronních rozhraní API generovaných možností svcutil /a . Tato /a možnost způsobí, že nástroj ServiceModel Metadata Utility Tool (Svcutil.exe) vygeneruje BeginXXX/EndXXX metody pro každou operaci služby, což umožňuje potenciálně dlouhotrvající volání vzdálených služeb na pozadí vlákna.

WCF ve scénářích s více domovskými stránkami nebo s více názvy

Služby WCF můžete nasadit ve webové farmě služby IIS, kde sada počítačů sdílí společný externí název (například http://www.contoso.com), ale jsou jednotlivě adresovány různými názvy hostitelů (například http://www.contoso.com mohou směrovat provoz na dva různé počítače s názvem http://machine1.internal.contoso.com a http://machine2.internal.contoso.com). Tento scénář nasazení je plně podporovaný službou WCF, ale vyžaduje speciální konfiguraci webu IIS, který hostuje služby WCF, aby zobrazoval správný (externí) název hostitele v metadatech služby (jazyk popisu webových služeb).

Chcete-li zajistit, aby se v metadatech služby vygeneroval správný název hostitele WCF, nakonfigurujte výchozí identitu pro web služby IIS, který je hostitelem služeb WCF, aby používal explicitní název hostitele. Například počítače, které se nacházejí ve www.contoso.com farmě, by měly používat vazbu lokality iis *:80:www.contoso.com pro protokol HTTP a *:443:www.contoso.com pro PROTOKOL HTTPS.

Vazby webu služby IIS můžete nakonfigurovat pomocí modulu snap-in konzoly MMC (IIS Microsoft Management Console).

Fondy aplikací spuštěné v různých kontextech uživatele přepíší sestavení z jiných účtů v dočasné složce.

Pokud chcete zajistit, aby fondy aplikací spuštěné v různých kontextech uživatelů nemohly přepsat sestavení z jiných účtů ve složce dočasných souborů ASP.NET, použijte různé identity a dočasné složky pro různé aplikace. Pokud máte například dvě virtuální aplikace /Application1 a / Application2, můžete vytvořit dva fondy aplikací, A a B se dvěma různými identitami. Fond aplikací A může běžet pod jednou identitou uživatele (uživatel1), zatímco fond aplikací B může běžet pod jinou identitou uživatele (user2) a nakonfigurovat /Application1 tak, aby používal A a /Application2 pro použití B.

V souboru Web.config můžete dočasnou složku nakonfigurovat pomocí <system.web/compilation/@tempFolder>. Pro /Application1 může být "c:\tempForUser1" a pro aplikaci2 může být "c:\tempForUser2". Udělte těmto složkám odpovídající oprávnění k zápisu pro tyto dvě identity.

Uživatel2 pak nemůže změnit složku generování kódu pro /application2 (v části c:\tempForUser1).

Povolení asynchronního zpracování

Ve výchozím nastavení se zprávy odeslané službě WCF hostované ve službě IIS 6.0 a starší zpracovávají synchronně. ASP.NET volání WCF ve vlastním vlákně (pracovní vlákno ASP.NET) a WCF používá k zpracování požadavku další vlákno. WCF se uchovává na pracovní vlákno ASP.NET, dokud jeho zpracování nekončí. To vede k synchronnímu zpracování požadavků. Zpracování požadavků asynchronně umožňuje větší škálovatelnost, protože snižuje počet vláken potřebných ke zpracování požadavku – WCF při zpracování požadavku neudržuje vlákno ASP.NET. Použití asynchronního chování se nedoporučuje pro počítače se službou IIS 6.0, protože neexistuje způsob, jak omezovat příchozí požadavky, které otevírají server útokům DOS (Denial Of Service ). Počínaje službou IIS 7.0 byla zavedena souběžná omezení požadavků: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0]"MaxConcurrentRequestsPerCpu. Díky tomuto novému omezení je bezpečné používat asynchronní zpracování. Ve výchozím nastavení je ve službě IIS 7.0 zaregistrovaná asynchronní obslužná rutina a modul. Pokud je tato možnost vypnutá, můžete ručně povolit asynchronní zpracování požadavků v souboru Web.config vaší aplikace. Nastavení, která používáte, závisí na vašem aspNetCompatibilityEnabled nastavení. Pokud jste nastavili aspNetCompatibilityEnabledfalsenastavení , nakonfigurujte ho System.ServiceModel.Activation.ServiceHttpModule , jak je znázorněno v následujícím fragmentu konfigurace.

<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>  

Pokud jste nastavili aspNetCompatibilityEnabledtruenastavení , nakonfigurujte ho, jak je znázorněno v následujícím fragmentu System.ServiceModel.Activation.ServiceHttpHandlerFactory konfigurace.

<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>  

Viz také