Postupy: Hostování služby WCF v IIS
Toto téma popisuje základní kroky potřebné k vytvoření služby WCF (Windows Communication Foundation), která je hostovaná v Internetová informační služba (IIS). V tomto tématu se předpokládá, že jste obeznámeni se službou IIS a rozumíte tomu, jak pomocí nástroje pro správu služby IIS vytvářet a spravovat aplikace IIS. Další informace o službě IIS naleznete v tématu Internetová informační služba. Služba WCF, která běží v prostředí služby IIS, plně využívá funkce služby IIS, jako je recyklace procesů, vypnutí nečinnosti, monitorování stavu procesu a aktivace na základě zpráv. Tato možnost hostování vyžaduje, aby služba IIS byla správně nakonfigurovaná, ale nevyžaduje zápis hostitelského kódu jako součást aplikace. Hostování služby IIS můžete použít pouze s přenosem HTTP.
Další informace o interakci WCF a ASP.NET naleznete v tématu Služby WCF a ASP.NET. Další informace o konfiguraci zabezpečení najdete v tématu Zabezpečení.
Zdrojovou kopii tohoto příkladu najdete v tématu Hostování služby IIS pomocí vloženého kódu.
Vytvoření služby hostované službou IIS
Ověřte, že je služba IIS nainstalovaná a spuštěná na vašem počítači. Další informace o instalaci a konfiguraci služby IIS naleznete v tématu Instalace a konfigurace služby IIS 7.0
Vytvořte novou složku pro soubory vaší aplikace s názvem IISHostedCalcService, ujistěte se, že ASP.NET má přístup k obsahu složky, a pomocí nástroje pro správu služby IIS vytvořte novou aplikaci IIS, která je fyzicky umístěna v tomto adresáři aplikace. Při vytváření aliasu pro adresář aplikace použijte iisHostedCalc.
V adresáři aplikace vytvořte nový soubor s názvem service.svc. Upravte tento soubor přidáním následujícího @ServiceHost prvku.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>
V adresáři aplikace vytvořte podadresář App_Code.
V podadresáři App_Code vytvořte soubor kódu s názvem Service.cs.
Na začátek souboru Service.cs přidejte následující
using
direktivy.using System; using System.ServiceModel;
Za direktivy
using
přidejte následující deklaraci oboru názvů.namespace Microsoft.ServiceModel.Samples { }
Definujte kontrakt služby uvnitř deklarace oboru názvů, jak je znázorněno v následujícím kódu.
[ServiceContract] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); }
<ServiceContract()> _ Public Interface ICalculator <OperationContract()> _ Function Add(ByVal n1 As Double, _ ByVal n2 As Double) As Double <OperationContract()> _ Function Subtract(ByVal n1 As Double, _ ByVal n2 As Double) As Double <OperationContract()> _ Function Multiply(ByVal n1 As Double, _ ByVal n2 As Double) As Double <OperationContract()> _ Function Divide(ByVal n1 As Double, _ ByVal n2 As Double) As Double End Interface
Implementujte kontrakt služby za definici kontraktu služby, jak je znázorněno v následujícím kódu.
public class CalculatorService : ICalculator { public double Add(double n1, double n2) { return n1 + n2; } public double Subtract(double n1, double n2) { return n1 - n2; } public double Multiply(double n1, double n2) { return n1 * n2; } public double Divide(double n1, double n2) { return n1 / n2; } }
Public Class CalculatorService Implements ICalculator Public Function Add(ByVal n1 As Double, _ ByVal n2 As Double) As Double Implements ICalculator.Add Return n1 + n2 End Function Public Function Subtract(ByVal n1 As Double, _ ByVal n2 As Double) As Double Implements ICalculator.Subtract Return n1 - n2 End Function Public Function Multiply(ByVal n1 As Double, _ ByVal n2 As Double) As Double Implements ICalculator.Multiply Return n1 * n2 End Function Public Function Divide(ByVal n1 As Double, _ ByVal n2 As Double) As Double Implements ICalculator.Divide Return n1 / n2 End Function End Class
V adresáři aplikace vytvořte soubor s názvem Web.config a do souboru přidejte následující konfigurační kód. V době běhu infrastruktura WCF používá informace k vytvoření koncového bodu, se kterým můžou klientské aplikace komunikovat.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehaviors"> <!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc --> <endpoint address="" binding="wsHttpBinding" contract="Microsoft.ServiceModel.Samples.ICalculator" /> <!-- The mex endpoint is exposed at http://localhost/servicemodelsamples/service.svc/mex --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehaviors"> <!-- Add the following element to your service behavior configuration. --> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
Tento příklad explicitně určuje koncové body v konfiguračním souboru. Pokud do služby nepřidáte žádné koncové body, modul runtime za vás přidá výchozí koncové body. Další informace o výchozích koncových bodech, vazbách a chování najdete v tématu Zjednodušená konfigurace a zjednodušená konfigurace pro služby WCF.
Abyste měli jistotu, že je služba hostovaná správně, otevřete prohlížeč a přejděte na adresu URL služby:
http://localhost/IISHostedCalc/Service.svc
Příklad
Následuje úplný seznam kódu pro službu kalkulačky hostované službou IIS.
using System;
using System.ServiceModel;
namespace Microsoft.ServiceModel.Samples
{
[ServiceContract]
public interface ICalculator
{
[OperationContract]
double Add(double n1, double n2);
[OperationContract]
double Subtract(double n1, double n2);
[OperationContract]
double Multiply(double n1, double n2);
[OperationContract]
double Divide(double n1, double n2);
}
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
}
public double Subtract(double n1, double n2)
{
return n1 - n2;
}
public double Multiply(double n1, double n2)
{
return n1 * n2;
}
public double Divide(double n1, double n2)
{
return n1 / n2;
}
}
}
Imports System.ServiceModel
Namespace Microsoft.ServiceModel.Samples
<ServiceContract()> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, _
ByVal n2 As Double) As Double
<OperationContract()> _
Function Subtract(ByVal n1 As Double, _
ByVal n2 As Double) As Double
<OperationContract()> _
Function Multiply(ByVal n1 As Double, _
ByVal n2 As Double) As Double
<OperationContract()> _
Function Divide(ByVal n1 As Double, _
ByVal n2 As Double) As Double
End Interface
Public Class CalculatorService
Implements ICalculator
Public Function Add(ByVal n1 As Double, _
ByVal n2 As Double) As Double Implements ICalculator.Add
Return n1 + n2
End Function
Public Function Subtract(ByVal n1 As Double, _
ByVal n2 As Double) As Double Implements ICalculator.Subtract
Return n1 - n2
End Function
Public Function Multiply(ByVal n1 As Double, _
ByVal n2 As Double) As Double Implements ICalculator.Multiply
Return n1 * n2
End Function
Public Function Divide(ByVal n1 As Double, _
ByVal n2 As Double) As Double Implements ICalculator.Divide
Return n1 / n2
End Function
End Class
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehaviors">
<!-- This endpoint is exposed at the base address provided by host: http://localhost/servicemodelsamples/service.svc -->
<endpoint address=""
binding="wsHttpBinding"
contract="Microsoft.ServiceModel.Samples.ICalculator" />
<!-- The mex endpoint is exposed at http://localhost/servicemodelsamples/service.svc/mex -->
<endpoint address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CalculatorServiceBehaviors">
<!-- Add the following element to your service behavior configuration. -->
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>