Как создать клиент Windows Communication Foundation
Это четвертая из шести задач, выполнение которых необходимо для создания базовой службы Windows Communication Foundation (WCF) и клиента, который может вызывать службу. Общие сведения обо всех шести задачах см. в разделе Учебник по началу работы.
В данном разделе описывается, как извлечь метаданные из службы WCF и использовать, чтобы создать прокси WCF для доступа к службе. Эта задача выполняется с помощью средства Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe), предоставленного WCF. Данное средство получает метаданные из службы и создает файл управляемого исходного кода на выбранном языке. Кроме создания прокси клиента данное средство также создает файл конфигурации, позволяющий клиентскому приложению подключаться к службе в одной из конечных точек.
Примечание |
---|
Можно добавить ссылку на службу в проект клиента в среде Visual Studio 2010, чтобы создать прокси-клиента вместо использования Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe). |
Внимание! |
---|
При вызове службы WCF из проекта библиотеки учетной записи-посредника в Visual Studio 2010 можно использовать команду «Добавить ссылку на службу» для автоматического создания прокси и связанного файла конфигурации. Файл конфигурации не будет использоваться проектом библиотеки классов. Файл конфигурации необходимо скопировать в каталог, который содержит исполняемый файл, вызывающий библиотеку классов. |
Клиентское приложение использует созданную учетную запись-посредник для создания клиентского объекта WCF. Эта процедура описана в разделе Как использовать клиент Windows Communication Foundation.
Код клиента, созданный этой задачей, приведен в примере после процедуры.
Создание клиента Windows Communication Foundation
Создайте в текущем решении новый проект для клиента в Visual Studio 2010, выполнив следующие действия.
В верхней правой области Обозревателя решений, в том решении, в котором находится служба, щелкните правой кнопкой мыши текущее решение (не проект) и выберите команду Добавить, а затем Новый проект.
В диалоговом окне Добавить новый проект выберите Visual Basic или Visual C#, а затем выберите шаблон Консольное приложение и назовите его Клиент. Используйте Расположение по умолчанию.
Нажмите кнопку ОК.
Добавьте ссылку на библиотеку System.ServiceModel.dll для проекта.
В Обозревателе решений щелкните правой кнопкой мыши папку Ссылки в проекте Клиент и выберите команду Добавить ссылку.
Перейдите на вкладку .NET и выберите библиотеку System.ServiceModel.dll (версии 4.0.0.0) из списка и нажмите кнопку ОК.
Примечание При использовании компилятора командной строки (например, Csc.exe или Vbc.exe) необходимо указать путь к сборкам. По умолчанию на компьютере под управлением Windows Vista используется путь Windows\Microsoft.NET\Framework\v4.0. Для пространства имен System.ServiceModel добавьте инструкцию
using
(Imports
в Visual Basic) в созданном файле Program.cs или Program.vb.Imports System.ServiceModel
using System.ServiceModel;
Нажмите в Visual Studio клавишу F5, чтобы запустить службу, созданную в предыдущем разделе. Дополнительные сведения см. в разделе Как размещать и запускать базовую службу Windows Communication Foundation.
Запустите средство Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) с соответствующими параметрами, чтобы создать клиентский код и файл конфигурации. Для этого выполните следующие действия.
В меню Пуск выберите пункт Все программы, а затем выберите пункт Visual Studio 2010. Выберите пункт Средства Visual Studio, а затем пункт Командная строка Visual Studio 2010.
Перейдите в каталог, в котором будет размещен клиентский код. Если клиентский проект создан со значениями по умолчанию, каталог размещается по адресу C:\Users\<имя_пользователя>\Мои документы\Visual Studio 10\Projects\Service\Client.
Чтобы создать клиентский код, используйте программу командной строки Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) с соответствующими переключателями. В следующем примере создается файл кода и файл конфигурации для службы.
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
По умолчанию код прокси-клиента создается в файле, имя которого совпадает с именем службы (в данном случае CalculatorService.cs или CalculatorService.vb, где расширение соответствует языку программирования: VB для Visual Basic или CS для C#). Параметр /out изменяет имя файла прокси-клиента на GeneratedProxy.cs. Параметр /config изменяет имя файла конфигурации клиента с Output.config (по умолчанию) на App.config. Заметьте, что оба файла создаются в каталоге C:\Users\<имя_пользователя>\Мои документы\Visual Studio 10\Projects\Service\Client.
Добавьте созданную учетную запись-посредник в клиентский проект в Visual Studio, щелкните правой кнопкой мыши клиентский проект в окне Обозреватель решений, выберите команду Добавить, а затем пункт Существующий элемент. Выберите файл generatedProxy, созданный в предыдущем действии.
Пример
В этом примере показан код клиента, созданный средством Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe).
'------------------------------------------------------------------------------
' <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);
}
}
Создание клиента Windows Communication Foundation (WCF) завершено. Перейдите к разделу Как настроить базовый клиент Windows Communication Foundation, чтобы настроить клиент. Сведения по устранению неполадок см. в разделе Устранение неполадок, связанных с учебником по началу работы.
См. также
Задачи
Образец для начала работы
Резидентное размещение
Практическое руководство. Публикация метаданных для службы с использованием файла конфигурации
Как использовать Svcutil.exe для загрузки документов метаданных
Основные понятия
Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe)