Gewusst wie: Hosten und Ausführen eines grundlegenden Windows Communication Foundation-Diensts
Dies ist die dritte von sechs Aufgaben, die zum Erstellen eines grundlegenden Windows Communication Foundation (WCF)-Diensts und eines Clients, der den Dienst aufrufen kann, erforderlich sind. Eine Übersicht über alle sechs Aufgaben finden Sie im Thema Lernprogramm "Erste Schritte".
In diesem Thema wird beschrieben, wie ein grundlegender Windows Communication Foundation (WCF)-Dienst ausgeführt wird. Dieses Verfahren umfasst die folgenden Schritte:
Erstellen einer Basisadresse für den Dienst
Erstellen eines Diensthosts für den Dienst
Aktivieren des Metadatenaustauschs
Öffnen des Diensthosts
Eine vollständige Liste des für diese Aufgabe geschriebenen Codes wird in einem Beispiel im Anschluss an das Verfahren bereitgestellt. Fügen Sie den folgenden Code in die Main()
-Methode ein, die in der Program
-Klasse definiert wird. Diese Klasse wurde beim Erstellen der Service
-Projektmappe generiert.
So konfigurieren Sie eine Basisadresse für den Dienst
Erstellen Sie eine Uri-Instanz für die Basisadresse des Diensts. Dieser URI gibt das HTTP-Schema, Ihren lokalen Computer, Anschlussnummer 8000 und den Pfad ServiceModelSample/Service zu dem Dienst an, der für den Namespace des Diensts im Dienstvertrag festgelegt wurde.
Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")
Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");
So hosten Sie den Dienst
Importieren Sie den
System.ServiceModel.Description
-Namespace. Diese Codezeile muss zusammen mit dem Rest der using- oder imports-Anweisungen am Anfang der Datei "Program.cs"/"Program.vb" platziert werden.Imports System.ServiceModel.Description
using System.ServiceModel.Description;
Erstellen Sie eine neue ServiceHost-Instanz, die als Host für den Dienst fungieren soll. Sie müssen den Typ angeben, der den Dienstvertrag und die Basisadresse implementiert. In diesem Beispiel wird die Basisadresse
https://localhost:8000/ServiceModelSamples/Service
verwendet.CalculatorService
ist der Typ, der den Dienstvertrag implementiert.Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
Fügen Sie eine try-catch-Anweisung ein, die eine CommunicationException abfängt, und fügen Sie in den try-Block den Code der nächsten drei Schritte ein. Durch die catch-Klausel sollte eine Fehlermeldung angezeigt und anschließend
selfHost.Abort()
aufgerufen werden.Try ' ... Catch ce As CommunicationException Console.WriteLine("An exception occurred: {0}", ce.Message) selfHost.Abort() End Try
try { // ... } catch (CommunicationException ce) { Console.WriteLine("An exception occurred: {0}", ce.Message); selfHost.Abort(); }
Fügen Sie einen Endpunkt hinzu, der den Dienst verfügbar macht. Dazu müssen Sie den Vertrag, den der Endpunkt verfügbar macht, eine Bindung und die Adresse für den Endpunkt angeben. Geben Sie in diesem Beispiel
ICalculator
als Vertrag,WSHttpBinding
als Bindung undCalculatorService
als Adresse an. Beachten Sie hierbei, dass die Endpunktadresse eine relative Adresse ist. Die vollständige Adresse des Endpunkts besteht aus der Basisadresse und der Endpunktadresse. In diesem Fall lautet die vollständige Adressehttps://localhost:8000/ServiceModelSamples/Service/CalculatorService
.' Add a service endpoint selfHost.AddServiceEndpoint( _ GetType(ICalculator), _ New WSHttpBinding(), _ "CalculatorService")
selfHost.AddServiceEndpoint( typeof(ICalculator), new WSHttpBinding(), "CalculatorService");
Hinweis: Ab .NET Framework 4 werden von der Runtime beim Öffnen des ServiceHost standardmäßig Endpunkte hinzugefügt, wenn für den Dienst keine Endpunkte explizit konfiguriert wurden. In diesem Beispiel wird ein Endpunkt explizit hinzugefügt, um die Vorgehensweise zu veranschaulichen. Weitere Informationen über zu Standardendpunkten, -bindungen und -verhalten erhalten Sie unter Vereinfachte Konfiguration und Vereinfachte Konfiguration für WCF-Dienste. Aktivieren Sie den Metadatenaustausch. Fügen Sie zu diesem Zweck ein Dienstmetadatenverhalten hinzu. Erstellen Sie zunächst eine ServiceMetadataBehavior-Instanz, legen Sie die HttpGetEnabled-Eigenschaft auf true fest, und fügen Sie dem Dienst anschließend das neue Verhalten hinzu. Weitere Informationen über zu Sicherheitsproblemen beim Veröffentlichen von Metadaten finden Sie unter Security Considerations with Metadata.
' Enable metadata exchange Dim smb As New ServiceMetadataBehavior() smb.HttpGetEnabled = True selfHost.Description.Behaviors.Add(smb)
ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; selfHost.Description.Behaviors.Add(smb);
Öffnen Sie den ServiceHost, und warten Sie eingehende Nachrichten. Schließen Sie den ServiceHost, wenn der Benutzer die Eingabetaste drückt.
selfHost.Open() Console.WriteLine("The service is ready.") Console.WriteLine("Press <ENTER> to terminate service.") Console.WriteLine() Console.ReadLine() ' Close the ServiceHostBase to shutdown the service. selfHost.Close()
selfHost.Open(); Console.WriteLine("The service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.WriteLine(); Console.ReadLine(); // Close the ServiceHostBase to shutdown the service. selfHost.Close();
So überprüfen Sie, ob der Dienst funktioniert
Führen Sie "service.exe" innerhalb von Visual Studio aus. Wird der Dienst unter Windows Vista ausgeführt, muss der Dienst über Administratorrechte verfügen. Da Visual Studio mit Administratorrechten ausgeführt wurde, wird auch "service.exe" mit Administratorrechten ausgeführt. Sie können auch eine neue Eingabeaufforderung mit Administratorrechten starten und "service.exe" damit ausführen.
Öffnen Sie Internet Explorer, und navigieren Sie unter "https://localhost:8000/ServiceModelSamples/Service" zur Debuggingseite des Diensts.
Beispiel
Das folgende Beispiel enthält den Dienstvertrag und die Implementierung aus den vorangegangenen Schritten im Lernprogramm und hostet den Dienst in einer Konsolenanwendung. Kompilieren Sie folgenden Code in eine ausführbare Datei mit dem Namen Service.exe.
Vergessen Sie nicht, beim Kompilieren des Codes auf System.ServiceModel.dll zu verweisen.
Imports System
Imports System.ServiceModel
Imports System.ServiceModel.Description
Module Service
' Define a service contract.
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
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
' Service class that implements the service contract.
' Added code to write output to the console window.
Public Class CalculatorService
Implements ICalculator
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
Dim result As Double = n1 + n2
Console.WriteLine("Received Add({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
Dim result As Double = n1 - n2
Console.WriteLine("Received Subtract({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
Dim result As Double = n1 * n2
Console.WriteLine("Received Multiply({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
Dim result As Double = n1 / n2
Console.WriteLine("Received Divide({0},{1})", n1, n2)
Console.WriteLine("Return: {0}", result)
Return result
End Function
End Class
Class Program
Shared Sub Main()
' Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Dim baseAddress As New Uri("https://localhost:8000/ServiceModelSamples/Service")
' Step 2 of the hosting procedure: Create ServiceHost
Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress)
Try
' Step 3 of the hosting procedure: Add a service endpoint.
' Add a service endpoint
selfHost.AddServiceEndpoint( _
GetType(ICalculator), _
New WSHttpBinding(), _
"CalculatorService")
' Step 4 of the hosting procedure: Enable metadata exchange.
' Enable metadata exchange
Dim smb As New ServiceMetadataBehavior()
smb.HttpGetEnabled = True
selfHost.Description.Behaviors.Add(smb)
' Step 5 of the hosting procedure: Start (and then stop) the service.
selfHost.Open()
Console.WriteLine("The service is ready.")
Console.WriteLine("Press <ENTER> to terminate service.")
Console.WriteLine()
Console.ReadLine()
' Close the ServiceHostBase to shutdown the service.
selfHost.Close()
Catch ce As CommunicationException
Console.WriteLine("An exception occurred: {0}", ce.Message)
selfHost.Abort()
End Try
End Sub
End Class
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace Microsoft.ServiceModel.Samples
{
// Define a service contract.
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
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);
}
// Service class that implements the service contract.
// Added code to write output to the console window.
public class CalculatorService : ICalculator
{
public double Add(double n1, double n2)
{
double result = n1 + n2;
Console.WriteLine("Received Add({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Subtract(double n1, double n2)
{
double result = n1 - n2;
Console.WriteLine("Received Subtract({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Multiply(double n1, double n2)
{
double result = n1 * n2;
Console.WriteLine("Received Multiply({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
public double Divide(double n1, double n2)
{
double result = n1 / n2;
Console.WriteLine("Received Divide({0},{1})", n1, n2);
Console.WriteLine("Return: {0}", result);
return result;
}
}
class Program
{
static void Main(string[] args)
{
// Step 1 of the address configuration procedure: Create a URI to serve as the base address.
Uri baseAddress = new Uri("https://localhost:8000/ServiceModelSamples/Service");
// Step 2 of the hosting procedure: Create ServiceHost
ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
try
{
// Step 3 of the hosting procedure: Add a service endpoint.
selfHost.AddServiceEndpoint(
typeof(ICalculator),
new WSHttpBinding(),
"CalculatorService");
// Step 4 of the hosting procedure: Enable metadata exchange.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
// Step 5 of the hosting procedure: Start (and then stop) the service.
selfHost.Open();
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
// Close the ServiceHostBase to shutdown the service.
selfHost.Close();
}
catch (CommunicationException ce)
{
Console.WriteLine("An exception occurred: {0}", ce.Message);
selfHost.Abort();
}
}
}
}
Hinweis: |
---|
Dienste wie dieser müssen dazu berechtigt sein, HTTP-Adressen auf dem Computer zum Überwachen zu registrieren. Administratorkonten verfügen über diese Berechtigung, anderen Konten muss diese Berechtigung für HTTP-Namespaces gewährt werden. Weitere Informationen über dazu, wie Namespacereservierungen konfiguriert werden, finden Sie unter Konfigurieren von HTTP und HTTPS. Wird der Dienst unter Visual Studio ausgeführt, muss "service.exe" über Administratorrechte verfügen. |
Der Dienst wird nun ausgeführt. Fahren Sie mit Gewusst wie: Erstellen eines Windows Communication Foundation-Clients fort. Informationen zur Problembehandlung finden Sie unter Problembehandlung für das Lernprogramm "Erste Schritte".