Udostępnij za pośrednictwem


Uzyskiwanie dostępu do usług za pomocą klienta WCF

Po utworzeniu usługi następnym krokiem jest utworzenie serwera proxy klienta WCF. Aplikacja kliencka używa serwera proxy klienta WCF do komunikowania się z usługą. Aplikacje klienckie zwykle importują metadane usługi w celu wygenerowania kodu klienta WCF, który może służyć do wywoływania usługi.

Podstawowe kroki tworzenia klienta programu WCF obejmują następujące elementy:

  1. Skompiluj kod usługi.

  2. Wygeneruj serwer proxy klienta programu WCF.

  3. Utwórz wystąpienie serwera proxy klienta programu WCF.

Serwer proxy klienta programu WCF można wygenerować ręcznie przy użyciu narzędzia service Model Metadata Tool (SvcUtil.exe), aby uzyskać więcej informacji, zobacz ServiceModel Metadata Utility Tool (Svcutil.exe). Serwer proxy klienta programu WCF można również wygenerować w programie Visual Studio przy użyciu funkcji Dodaj odwołanie do usługi. Aby wygenerować serwer proxy klienta WCF przy użyciu jednej z metod, usługa musi być uruchomiona. Jeśli usługa jest hostowana samodzielnie, musisz uruchomić hosta. Jeśli usługa jest hostowana w usługach IIS/WAS, nie musisz wykonywać żadnych innych czynności.

Narzędzie ServiceModel Metadata Tool

Narzędzie ServiceModel Metadata Tool (Svcutil.exe) to narzędzie wiersza polecenia służące do generowania kodu z metadanych. Poniżej przedstawiono przykład podstawowego polecenia Svcutil.exe.

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

Alternatywnie można użyć Svcutil.exe z plikami Web Services Description Language (WSDL) i XML Schema Definition Language (XSD) w systemie plików.

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

Wynikiem jest plik kodu zawierający kod klienta WCF, którego aplikacja kliencka może użyć do wywołania usługi.

Możesz również użyć narzędzia do generowania plików konfiguracji.

Svcutil.exe <file1 [,file2]>

Jeśli podano tylko jedną nazwę pliku, jest to nazwa pliku wyjściowego. Jeśli podano dwie nazwy plików, pierwszy plik jest plikiem konfiguracji wejściowej, którego zawartość jest scalana z wygenerowaną konfiguracją i zapisana w drugim pliku. Aby uzyskać więcej informacji na temat konfiguracji, zobacz Konfigurowanie powiązań dla usług.

Ważne

Niezabezpieczone żądania metadanych stanowią pewne zagrożenia w taki sam sposób, jak każde niezabezpieczone żądanie sieciowe: jeśli nie masz pewności, że punkt końcowy, z którym się komunikujesz, jest tym, z kim mówi, informacje, które pobierasz, mogą być metadanymi ze złośliwej usługi.

Dodawanie dokumentacji usługi w programie Visual Studio

Po uruchomieniu usługi kliknij prawym przyciskiem myszy projekt, który będzie zawierać serwer proxy klienta WCF, a następnie wybierz polecenie Dodaj>odwołanie do usługi. W oknie dialogowym Dodawanie odwołania do usługi wpisz adres URL usługi, którą chcesz wywołać, a następnie kliknij przycisk Przejdź. W oknie dialogowym zostanie wyświetlona lista usług dostępnych pod określonym adresem. Kliknij dwukrotnie usługę, aby wyświetlić dostępne kontrakty i operacje, określić przestrzeń nazw dla wygenerowanego kodu, a następnie kliknij przycisk OK .

Przykład

Poniższy przykład kodu przedstawia kontrakt usługi utworzony dla usługi.

// 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

Narzędzie serviceModel metadata tool i Add Service Reference in Visual Studio generuje następującą klasę klienta WCF. Klasa dziedziczy z klasy ogólnej ClientBase<TChannel> i implementuje ICalculator interfejs. Narzędzie generuje ICalculator również interfejs (nie pokazano tutaj).

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

Korzystanie z klienta WCF

Aby użyć klienta WCF, utwórz wystąpienie klienta WCF, a następnie wywołaj jego metody, jak pokazano w poniższym kodzie.

// 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)

Debugowanie wyjątków zgłaszanych przez klienta

Wiele wyjątków zgłaszanych przez klienta WCF jest spowodowanych wyjątkiem w usłudze. Oto kilka przykładów:

  • SocketException: Istniejące połączenie zostało wymuszone przez hosta zdalnego.

  • CommunicationException: Połączenie bazowe zostało nieoczekiwanie zamknięte.

  • CommunicationObjectAbortedException: Połączenie gniazda zostało przerwane. Może to być spowodowane przez błąd podczas przetwarzania komunikatu, przekroczenie limitu czasu odbierania przez hosta zdalnego lub problem z podstawowym zasobem sieciowym.

W przypadku wystąpienia tego typu wyjątków najlepszym sposobem rozwiązania problemu jest włączenie śledzenia po stronie usługi i określenie, jaki wyjątek wystąpił. Aby uzyskać więcej informacji na temat śledzenia, zobacz Śledzenie i używanie śledzenia do rozwiązywania problemów z aplikacją.

Zobacz też