Udostępnij za pośrednictwem


Komunikacja jednokierunkowa

W przykładzie Oneway pokazano kontakt z usługą jednokierunkową operacjami usługi. Klient nie czeka na ukończenie operacji usługi, podobnie jak w przypadku operacji usługi dwukierunkowej. Ten przykład jest oparty na artykule Wprowadzenie i używa wsHttpBinding powiązania. Usługa w tym przykładzie jest aplikacją konsolową self-hosted, która umożliwia obserwowanie usługi, która odbiera i przetwarza żądania. Klient jest również aplikacją konsolową.

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

Aby utworzyć jednokierunkowy kontrakt usługi, zdefiniuj kontrakt usługi, zastosuj OperationContractAttribute klasę do każdej operacji i ustaw na true wartość IsOneWay , jak pokazano w poniższym przykładowym kodzie:

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface IOneWayCalculator
{
    [OperationContract(IsOneWay=true)]
    void Add(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Subtract(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Multiply(double n1, double n2);
    [OperationContract(IsOneWay = true)]
    void Divide(double n1, double n2);
}

Aby zademonstrować, że klient nie czeka na ukończenie operacji usługi, kod usługi w tym przykładzie implementuje pięciosekundowe opóźnienie, jak pokazano w poniższym przykładowym kodzie:

// This service class implements the service contract.
// This code writes output to the console window.
 [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
    InstanceContextMode = InstanceContextMode.PerCall)]
public class CalculatorService : IOneWayCalculator
{
    public void Add(double n1, double n2)
    {
        Console.WriteLine("Received Add({0},{1}) - sleeping", n1, n2);
        System.Threading.Thread.Sleep(1000 * 5);
        double result = n1 + n2;
        Console.WriteLine("Processing Add({0},{1}) - result: {2}", n1, n2, result);
    }
    ...
}

Gdy klient wywołuje usługę, wywołanie zwraca się bez oczekiwania na ukończenie operacji usługi.

Po uruchomieniu przykładu działania klienta i usługi są wyświetlane zarówno w oknach konsoli usługi, jak i klienta. Usługa odbiera komunikaty od klienta. Naciśnij klawisz ENTER w każdym oknie konsoli, aby zamknąć zarówno usługę, jak i klienta.

Klient kończy działanie przed usługą, co pokazuje, że klient nie czeka na ukończenie jednokierunkowych operacji usługi. Dane wyjściowe klienta są następujące:

Add(100,15.99)
Subtract(145,76.54)
Multiply(9,81.25)
Divide(22,7)

Press <ENTER> to terminate client.

Wyświetlane są następujące dane wyjściowe usługi:

The service is ready.
Press <ENTER> to terminate service.

Received Add(100,15.99) - sleeping
Received Subtract(145,76.54) - sleeping
Received Multiply(9,81.25) - sleeping
Received Divide(22,7) - sleeping
Processing Add(100,15.99) - result: 115.99
Processing Subtract(145,76.54) - result: 68.46
Processing Multiply(9,81.25) - result: 731.25
Processing Divide(22,7) - result: 3.14285714285714

Uwaga

HTTP to z definicji protokół żądania/odpowiedzi; po wysłaniu żądania zostanie zwrócona odpowiedź. Dotyczy to nawet jednokierunkowej operacji usługi uwidocznionej za pośrednictwem protokołu HTTP. Po wywołaniu operacji usługa zwraca kod stanu HTTP 202 przed wykonaniem operacji usługi. Ten kod stanu oznacza, że żądanie zostało zaakceptowane do przetworzenia, ale przetwarzanie nie zostało jeszcze ukończone. Klient, który nazwał operację blokuje, dopóki nie otrzyma odpowiedzi 202 z usługi. Może to spowodować nieoczekiwane zachowanie, gdy wiele komunikatów jednokierunkowych jest wysyłanych przy użyciu powiązania skonfigurowanego do korzystania z sesji. wsHttpBinding Powiązanie używane w tym przykładzie jest skonfigurowane do używania sesji domyślnie w celu ustanowienia kontekstu zabezpieczeń. Domyślnie komunikaty w sesji mają gwarancję nadejścia w kolejności, w której są wysyłane. Z tego powodu po wysłaniu drugiego komunikatu w sesji nie jest przetwarzany, dopóki pierwszy komunikat nie zostanie przetworzony. W rezultacie klient nie otrzyma odpowiedzi 202 dla komunikatu do momentu zakończenia przetwarzania poprzedniego komunikatu. W związku z tym klient wydaje się blokować każde kolejne wywołanie operacji. Aby uniknąć tego zachowania, w tym przykładzie środowisko uruchomieniowe konfiguruje wysyłanie komunikatów współbieżnie do odrębnych wystąpień na potrzeby przetwarzania. Przykładowe zestawy są InstanceContextMode ustawiane tak PerCall , aby każdy komunikat mógł być przetwarzany przez inne wystąpienie. ConcurrencyModeMultiple parametr ma zezwalać więcej niż jednemu wątkowi na wysyłanie komunikatów jednocześnie.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.

Uwaga

Uruchom usługę przed uruchomieniem klienta i zamknij klienta przed zamknięciem usługi. Pozwala to uniknąć wyjątku klienta, gdy klient nie może zamknąć sesji zabezpieczeń w sposób czysty, ponieważ usługa nie istnieje.