Обращение к службам с использованием клиента WCF

После создания службы необходимо создать прокси-сервер клиента WCF. Клиентское приложение использует прокси-сервер клиента WCF для взаимодействия со службой. Клиентские приложения обычно импортируют метаданные службы для создания клиентского кода WCF, который можно использовать для вызова службы.

Ниже приведены основные шаги по созданию клиента WCF:

  1. Скомпилируйте код службы.

  2. Создайте прокси-сервер клиента WCF.

  3. Создайте экземпляр клиентского прокси-класса WCF.

Прокси-сервер клиента WCF можно создать вручную с помощью средства служебной программы метаданных модели службы (SvcUtil.exe) для получения дополнительных сведений: средство служебной программы метаданных ServiceModel (Svcutil.exe). Прокси-сервер клиента WCF также можно создать в Visual Studio с помощью функции добавления ссылки на службу. Для создания клиентского прокси-класса WCF любым методом выбранная служба должна быть запущена. Если служба размещается резидентно, то необходимо запустить узел. Если служба размещена на веб-сервере IIS/WAS, то больше ничего делать не нужно.

Средство ServiceModel Metadata Utility Tool

Служебная программа метаданных ServiceModel (Svcutil.exe) — это средство командной строки для создания кода из метаданных. Ниже приведен пример базовой команды Svcutil.exe.

Svcutil.exe <service's Metadata Exchange (MEX) address or HTTP GET address>

Средство Svcutil.exe можно также использовать с файлами языков WSDL (язык описания веб-служб) и XSD (язык определения схемы XML) в файловой системе.

Svcutil.exe <list of WSDL and XSD files on file system>

Результатом является файл кода, содержащий клиентский код WCF, который клиентское приложение может использовать для вызова службы.

Кроме того, с помощью этого средства можно создавать файлы конфигурации.

Svcutil.exe <file1 [,file2]>

Если задано только одно имя файла, это имя выходного файла. Если задано два имени файла, то первый файл является исходным файлом конфигурации, содержимое которого объединяется с создаваемой конфигурацией и записывается во второй файл. Дополнительные сведения о конфигурации см. в разделе "Настройка привязок для служб".

Внимание

Незащищенные запросы метаданных представляют определенную угрозу, подобно незащищенным сетевым запросам. Если нет уверенности, что конечная точка, с которой осуществляется взаимодействие, является той точкой, за которую она себя выдает, получаемая информация может представлять собой метаданные вредоносной службы.

Функция «Добавить ссылку на службу» в Visual Studio

При выполнении службы щелкните правой кнопкой мыши проект, содержащий прокси-сервер клиента WCF, и выберите "Добавить>ссылку на службу". В диалоговом окне "Добавить ссылку на службу" введите URL-адрес службы, которую вы хотите вызвать, и нажмите кнопку "Перейти". В диалоговом окне отобразится список доступных служб по указанному адресу. Дважды щелкните службу, чтобы просмотреть доступные контракты и операции, укажите пространство имен для созданного кода и нажмите кнопку "ОК ".

Пример

В следующем примере кода показан созданный контракт службы.

// Define a service contract.
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    // Other methods are not shown here.
}
' 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
    ' Other methods are not shown here.
End Interface

Средство служебной программы метаданных ServiceModel и добавление ссылки на службу в Visual Studio создает следующий клиентский класс WCF. Класс наследует универсальному классу ClientBase<TChannel> и реализует интерфейс ICalculator. Кроме того, это средство создает интерфейс ICalculator (не показан в этом примере).

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);
    }
}
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
End Class

Использование клиента WCF

Чтобы использовать клиент WCF, создайте экземпляр клиента WCF и вызовите его методы, как показано в следующем коде.

// Create a client object with the given client endpoint configuration.
CalculatorClient calcClient = new CalculatorClient("CalculatorEndpoint");
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = calcClient.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
' Create a client object with the given client endpoint configuration.
Dim calcClient As CalculatorClient = _
New CalculatorClient("CalculatorEndpoint")

' Call the Add service operation.
Dim value1 As Double = 100.00D
Dim value2 As Double = 15.99D
Dim result As Double = calcClient.Add(value1, value2)
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result)

Отладка создаваемых клиентом исключений

Многие исключения, вызванные клиентом WCF, вызваны исключением в службе. Ниже приведены некоторые примеры.

  • SocketException: существующее подключение было принудительно закрыто удаленным узлом.

  • CommunicationException: базовое подключение было неожиданно закрыто.

  • CommunicationObjectAbortedException: подключение к сокету было прервано. Это может быть вызвано ошибкой при обработке сообщения, истечением времени ожидания на удаленном узле или проблемой с соответствующим сетевым ресурсом.

Если происходят исключения этих типов, лучшим решением проблемы является включение трассировки на стороне службы и определение исключения, которое там произошло. Дополнительные сведения о трассировке см. в разделе "Трассировка" и "Использование трассировки для устранения неполадок с приложением".

См. также