Anvisningar: Värd för en WCF-tjänst i IIS
Det här avsnittet beskriver de grundläggande steg som krävs för att skapa en WCF-tjänst (Windows Communication Foundation) som finns i IIS (Internet Information Services). Det här avsnittet förutsätter att du är bekant med IIS och förstår hur du använder IIS-hanteringsverktyget för att skapa och hantera IIS-program. Mer information om IIS finns i Internet Information Services. En WCF-tjänst som körs i IIS-miljön drar full nytta av IIS-funktioner, till exempel processåtervinning, inaktiv avstängning, övervakning av processhälsa och meddelandebaserad aktivering. Det här värdalternativet kräver att IIS är korrekt konfigurerat, men det kräver inte att någon värdkod skrivs som en del av programmet. Du kan endast använda IIS-värdtjänster med en HTTP-transport.
Mer information om hur WCF och ASP.NET interagerar finns i WCF-tjänster och ASP.NET. Mer information om hur du konfigurerar säkerhet finns i Säkerhet.
Källkopian av det här exemplet finns i IIS Hosting Using Inline Code (IIS-värd med infogad kod).
Så här skapar du en tjänst som hanteras av IIS
Bekräfta att IIS är installerat och körs på datorn. Mer information om hur du installerar och konfigurerar IIS finns i Installera och konfigurera IIS 7.0
Skapa en ny mapp för dina programfiler med namnet "IISHostedCalcService", se till att ASP.NET har åtkomst till innehållet i mappen och använd IIS-hanteringsverktyget för att skapa ett nytt IIS-program som finns fysiskt i den här programkatalogen. När du skapar ett alias för programkatalogen använder du "IISHostedCalc".
Skapa en ny fil med namnet "service.svc" i programkatalogen. Redigera den här filen genom att lägga till följande @ServiceHost element.
<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>
Skapa en App_Code underkatalog i programkatalogen.
Skapa en kodfil med namnet Service.cs i underkatalogen App_Code.
Lägg till följande
using
direktiv överst i filen Service.cs.using System; using System.ServiceModel;
Lägg till följande namnområdesdeklaration efter direktiven
using
.namespace Microsoft.ServiceModel.Samples { }
Definiera tjänstkontraktet i namnområdesdeklarationen enligt följande kod.
[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
Implementera tjänstkontraktet efter definitionen av tjänstkontraktet enligt följande kod.
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
Skapa en fil med namnet "Web.config" i programkatalogen och lägg till följande konfigurationskod i filen. Vid körning använder WCF-infrastrukturen informationen för att konstruera en slutpunkt som klientprogram kan kommunicera med.
<?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>
Det här exemplet anger uttryckligen slutpunkter i konfigurationsfilen. Om du inte lägger till några slutpunkter i tjänsten lägger körningen till standardslutpunkter åt dig. Mer information om standardslutpunkter, bindningar och beteenden finns i Förenklad konfiguration och förenklad konfiguration för WCF-tjänster.
Om du vill kontrollera att tjänsten är korrekt värd öppnar du en webbläsare och bläddrar till tjänstens URL:
http://localhost/IISHostedCalc/Service.svc
Exempel
Följande är en fullständig lista över koden för den IIS-värdbaserade kalkylatortjänsten.
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>