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


Доступ к службам с помощью клиента WCF

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

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

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

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

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

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

Инструмент работы с метаданными ServiceModel

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

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

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

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 Metadata и Добавить ссылку на службу в 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: подключение сокета было прервано. Это может быть вызвано ошибкой обработки сообщения, превышением времени ожидания получения удаленным узлом или проблемой базового сетевого ресурса.

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

См. также