Поделиться через


Как создать клиент Windows Communication Foundation

Это четвертая из шести задач, выполнение которых необходимо для создания базовой службы Windows Communication Foundation (WCF) и клиента, который может вызывать службу. Общие сведения обо всех шести задачах см. в разделе Учебник по началу работы.

В данном разделе описывается, как извлечь метаданные из службы WCF и использовать, чтобы создать прокси WCF для доступа к службе. Эта задача выполняется с помощью средства Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe), предоставленного WCF. Данное средство получает метаданные из службы и создает файл управляемого исходного кода на выбранном языке. Кроме создания прокси клиента данное средство также создает файл конфигурации, позволяющий клиентскому приложению подключаться к службе в одной из конечных точек.

ms733133.note(ru-ru,VS.100).gifПримечание
Можно добавить ссылку на службу в проект клиента в среде Visual Studio 2010, чтобы создать прокси-клиента вместо использования Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe).

ms733133.Warning(ru-ru,VS.100).gif Внимание!
При вызове службы WCF из проекта библиотеки учетной записи-посредника в Visual Studio 2010 можно использовать команду «Добавить ссылку на службу» для автоматического создания прокси и связанного файла конфигурации. Файл конфигурации не будет использоваться проектом библиотеки классов. Файл конфигурации необходимо скопировать в каталог, который содержит исполняемый файл, вызывающий библиотеку классов.

Клиентское приложение использует созданную учетную запись-посредник для создания клиентского объекта WCF. Эта процедура описана в разделе Как использовать клиент Windows Communication Foundation.

Код клиента, созданный этой задачей, приведен в примере после процедуры.

Создание клиента Windows Communication Foundation

  1. Создайте в текущем решении новый проект для клиента в Visual Studio 2010, выполнив следующие действия.

    1. В верхней правой области Обозревателя решений, в том решении, в котором находится служба, щелкните правой кнопкой мыши текущее решение (не проект) и выберите команду Добавить, а затем Новый проект.

    2. В диалоговом окне Добавить новый проект выберите Visual Basic или Visual C#, а затем выберите шаблон Консольное приложение и назовите его Клиент. Используйте Расположение по умолчанию.

    3. Нажмите кнопку ОК.

  2. Добавьте ссылку на библиотеку System.ServiceModel.dll для проекта.

    1. В Обозревателе решений щелкните правой кнопкой мыши папку Ссылки в проекте Клиент и выберите команду Добавить ссылку.

    2. Перейдите на вкладку .NET и выберите библиотеку System.ServiceModel.dll (версии 4.0.0.0) из списка и нажмите кнопку ОК.

    ms733133.note(ru-ru,VS.100).gifПримечание
    При использовании компилятора командной строки (например, Csc.exe или Vbc.exe) необходимо указать путь к сборкам. По умолчанию на компьютере под управлением Windows Vista используется путь Windows\Microsoft.NET\Framework\v4.0.

  3. Для пространства имен System.ServiceModel добавьте инструкцию using (Imports в Visual Basic) в созданном файле Program.cs или Program.vb.

    Imports System.ServiceModel
    
    using System.ServiceModel;
    
  4. Нажмите в Visual Studio клавишу F5, чтобы запустить службу, созданную в предыдущем разделе. Дополнительные сведения см. в разделе Как размещать и запускать базовую службу Windows Communication Foundation.

  5. Запустите средство Служебное средство ServiceModel Metadata Utility Tool (Svcutil.exe) с соответствующими параметрами, чтобы создать клиентский код и файл конфигурации. Для этого выполните следующие действия.

    1. В меню Пуск выберите пункт Все программы, а затем выберите пункт Visual Studio 2010. Выберите пункт Средства Visual Studio, а затем пункт Командная строка Visual Studio 2010.

    2. Перейдите в каталог, в котором будет размещен клиентский код. Если клиентский проект создан со значениями по умолчанию, каталог размещается по адресу C:\Users\<имя_пользователя>\Мои документы\Visual Studio 10\Projects\Service\Client.

    3. Чтобы создать клиентский код, используйте программу командной строки Служебное средство 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.

  6. Добавьте созданную учетную запись-посредник в клиентский проект в 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)