Gewusst wie: Erstellen eines Windows Communication Foundation-Clients
Dies ist die vierte 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 Metadaten von einem WCF-Dienst abgerufen und dafür verwendet werden können, einen WCF-Clientproxy zu erstellen, der auf den Dienst zugreifen kann. Für diese Aufgabe wird das ServiceModel Metadata Utility-Tool (Svcutil.exe) verwendet, das von WCF bereitgestellt wird. Dieses Tool ruft die Metadaten vom Dienst ab und generiert eine verwaltete Quellcodedatei für einen Proxy in der von Ihnen verwendeten Sprache. Zusätzlich zu dem Clientproxy erstellt das Tool auch eine Konfigurationsdatei für den Client, die es der Clientanwendung ermöglicht, über einen ihrer Endpunkte eine Verbindung mit dem Dienst herzustellen.
Hinweis: |
---|
Sie können dem Clientprojekt in Visual Studio 2010 einen Dienstverweis hinzufügen, um den Clientproxy zu erstellen, anstatt ServiceModel Metadata Utility-Tool (Svcutil.exe) zu verwenden. |
Vorsicht: |
---|
Wenn Sie einen WCF-Dienst aus einem Klassenbibliotheksprojekt in Visual Studio 2010 aufrufen, können Sie die Funktion zum Hinzufügen eines Dienstverweises verwenden, um automatisch einen Proxy und eine zugeordnete Konfigurationsdatei zu generieren. Die Konfigurationsdatei wird nicht vom Klassenbibliotheksprojekt verwendet. Sie müssen die Konfigurationsdatei in das Verzeichnis kopieren, das die ausführbare Datei enthält, die die Klassenbibliothek aufruft. |
Die Clientanwendung verwendet den generierten Proxy, um ein WCF-Clientobjekt zu erstellen. Dieses Verfahren wird unter Gewusst wie: Verwenden eines Windows Communication Foundation-Clients beschrieben.
Der Code für den von dieser Aufgabe generierten Client wird in dem Beispiel bereitgestellt, das dem Verfahren folgt.
So erstellen Sie einen Windows Communication Foundation-Client
Erstellen Sie in Visual Studio 2010 ein neues Projekt innerhalb der aktuellen Projektmappe für den Client, indem Sie die folgenden Schritte ausführen:
Klicken Sie im Projektmappen-Explorer (rechts oben) in der Projektmappe, die auch den Dienst enthält, mit der rechten Maustaste auf die aktuelle Projektmappe (nicht auf das Projekt), und wählen Sie die Option Hinzufügen und anschließend Neues Projekt aus.
Wählen Sie im Dialogfeld Neues Projekt Visual Basic oder Visual C#, wählen Sie die Vorlage Konsolenanwendung, und nennen Sie das Projekt Client. Verwenden Sie den vorgeschlagenen Speicherort.
Klicken Sie auf OK.
Fügen Sie für das Projekt einen Verweis auf die System.ServiceModel.dll -Datei hinzu:
Klicken Sie im Projektmappen-Explorer unter dem Projekt Client auf den Ordner Verweise, und wählen Sie die Option Verweis hinzufügen.
Klicken Sie auf die Registerkarte .NET, wählen Sie im Listenfeld die Datei System.ServiceModel.dll (Version 4.0.0.0) aus, und klicken Sie anschließend auf OK.
Hinweis: Wenn Sie einen Befehlszeilencompiler verwenden (beispielsweise "Csc.exe" oder "Vbc.exe"), müssen Sie auch den Pfad zu den Assemblys angeben. Standardmäßig lautet auf einem Computer, auf dem Windows Vista ausgeführt wird, der Pfad wie folgt: Windows\Microsoft.NET\Framework\v4.0. Fügen Sie in der generierten Program.cs- oder Program.vb-Datei für den System.ServiceModel-Namespace eine
using
-Anweisung (Imports
in Visual Basic) hinzu.Imports System.ServiceModel
using System.ServiceModel;
Drücken Sie in Visual Studio die F5-TASTE, um den im vorherigen Thema erstellten Dienst zu starten. Weitere Informationen finden Sie unter Gewusst wie: Hosten und Ausführen eines grundlegenden Windows Communication Foundation-Diensts.
Starten Sie das ServiceModel Metadata Utility-Tool (Svcutil.exe) mit den entsprechenden Schaltern zur Erstellung des Clientcode und einer Konfigurationsdatei, indem Sie die folgenden Schritte ausführen:
Klicken Sie im Startmenü auf Alle Programme, und klicken Sie dann auf Visual Studio 2010. Klicken Sie auf Visual Studio Tools, und klicken Sie dann auf Visual Studio 2010-Eingabeaufforderung.
Wechseln Sie in das Verzeichnis, in das Sie den Clientcode platzieren möchten. Haben Sie Ihr Clientprojekt mit den Standardeinstellungen erstellt, lautet das Verzeichnis "C:\Benutzer\<Benutzername>\Eigene Dateien\Visual Studio 10\Projects\Service\Client".
Verwenden Sie das Befehlszeilentool ServiceModel Metadata Utility-Tool (Svcutil.exe) mit den entsprechenden Schaltern, um den Clientcode zu erstellen. Im folgenden Beispiel werden eine Code- und eine Konfigurationsdatei für den Dienst erstellt:
svcutil.exe /language:vb /out:generatedProxy.vb /config:app.config https://localhost:8000/ServiceModelSamples/service
svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config https://localhost:8000/ServiceModelSamples/service
Standardmäßig wird der Proxycode in einer Datei generiert, die nach dem Dienst benannt ist (in diesem Fall z. B. "CalculatorService.cs" oder "CalculatorService.vb", wobei die Erweiterung der Programmiersprache entspricht: ".vb" für Visual Basic oder ".cs" für C#). Der verwendete /out-Schalter ändert den Namen der Clientproxydatei in "GeneratedProxy.cs". Der /config-Schalter ändert den Standardnamen "Output.config" der Clientkonfigurationsdatei in "App.config". Beachten Sie, dass diese beiden Dateien im Verzeichnis "C:\Benutzer\<Benutzername>\Eigene Dateien\Visual Studio 10\Projects\Service\Client" erstellt werden.
Fügen Sie in Visual Studio den generierten Proxy dem Clientprojekt hinzu, indem Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Clientprojekt klicken und anschließend auf Hinzufügen und dann auf Vorhandenes Element klicken. Wählen Sie die im vorangehenden Schritt generierte generatedProxy-Datei aus.
Beispiel
In diesem Beispiel wird der von ServiceModel Metadata Utility-Tool (Svcutil.exe) generierte Clientcode gezeigt.
'------------------------------------------------------------------------------
' <auto-generated>
' This code was generated by a tool.
' Runtime Version:2.0.50727.1366
'
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------
Option Strict Off
Option Explicit On
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0"), _
System.ServiceModel.ServiceContractAttribute([Namespace]:="http://Microsoft.ServiceModel.Samples", ConfigurationName:="ICalculator")> _
Public Interface ICalculator
<System.ServiceModel.OperationContractAttribute(Action:="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction:="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
<System.ServiceModel.OperationContractAttribute(Action:="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction:="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")> _
Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
<System.ServiceModel.OperationContractAttribute(Action:="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction:="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")> _
Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
<System.ServiceModel.OperationContractAttribute(Action:="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction:="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")> _
Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
End Interface
<System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")> _
Public Interface ICalculatorChannel
Inherits ICalculator, System.ServiceModel.IClientChannel
End Interface
<System.Diagnostics.DebuggerStepThroughAttribute(), _
System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")> _
Partial Public Class CalculatorClient
Inherits System.ServiceModel.ClientBase(Of ICalculator)
Implements ICalculator
Public Sub New()
MyBase.New
End Sub
Public Sub New(ByVal endpointConfigurationName As String)
MyBase.New(endpointConfigurationName)
End Sub
Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As String)
MyBase.New(endpointConfigurationName, remoteAddress)
End Sub
Public Sub New(ByVal endpointConfigurationName As String, ByVal remoteAddress As System.ServiceModel.EndpointAddress)
MyBase.New(endpointConfigurationName, remoteAddress)
End Sub
Public Sub New(ByVal binding As System.ServiceModel.Channels.Binding, ByVal remoteAddress As System.ServiceModel.EndpointAddress)
MyBase.New(binding, remoteAddress)
End Sub
Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add
Return MyBase.Channel.Add(n1, n2)
End Function
Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract
Return MyBase.Channel.Subtract(n1, n2)
End Function
Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply
Return MyBase.Channel.Multiply(n1, n2)
End Function
Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide
Return MyBase.Channel.Divide(n1, n2)
End Function
End Class
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:2.0.50727.1366
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://Microsoft.ServiceModel.Samples", ConfigurationName="ICalculator")]
public interface ICalculator
{
[System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")]
double Add(double n1, double n2);
[System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")]
double Subtract(double n1, double n2);
[System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")]
double Multiply(double n1, double n2);
[System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")]
double Divide(double n1, double n2);
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface ICalculatorChannel : ICalculator, System.ServiceModel.IClientChannel
{
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class CalculatorClient : System.ServiceModel.ClientBase<ICalculator>, ICalculator
{
public CalculatorClient()
{
}
public CalculatorClient(string endpointConfigurationName) :
base(endpointConfigurationName)
{
}
public CalculatorClient(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}
public CalculatorClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}
public CalculatorClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :
base(binding, remoteAddress)
{
}
public double Add(double n1, double n2)
{
return base.Channel.Add(n1, n2);
}
public double Subtract(double n1, double n2)
{
return base.Channel.Subtract(n1, n2);
}
public double Multiply(double n1, double n2)
{
return base.Channel.Multiply(n1, n2);
}
public double Divide(double n1, double n2)
{
return base.Channel.Divide(n1, n2);
}
}
Sie haben nun einen Windows Communication Foundation (WCF)-Client erstellt. Fahren Sie mit Gewusst wie: Konfigurieren eines grundlegenden Windows Communication Foundation-Clients fort, um den Client zu konfigurieren. Informationen zur Problembehandlung finden Sie unter Problembehandlung für das Lernprogramm "Erste Schritte".
Siehe auch
Aufgaben
Beispiel 'Erste Schritte'
Selbst gehostete Dienste
Gewusst wie: Veröffentlichen von Metadaten für einen Dienst mithilfe einer Konfigurationsdatei
Gewusst wie: Verwenden von Svcutil.exe zum Herunterladen von Metadatendokumenten