Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przykład Oneway demonstruje kontakt z jednokierunkową usługą oraz jej operacjami. Klient nie oczekuje na zakończenie operacji serwisowych, podobnie jak w przypadku operacji serwisowych dwukierunkowych. Ten przykład jest oparty na sekcji Wprowadzenie i używa wsHttpBinding
powiązania. Usługa w tym przykładzie jest samodzielnie hostowaną aplikacją konsolową, która umożliwia obserwację usługi odbierającej i przetwarzającej żądania. Klient jest również aplikacją konsolową.
Uwaga / Notatka
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 klasę OperationContractAttribute do każdej operacji i ustaw IsOneWay na true
, jak w poniższym przykładzie kodu.
[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 jest zwracane natychmiast, bez oczekiwania na zakończenie operacji usługi.
Po uruchomieniu przykładu, działania klienta i usługi są zaprezentowane zarówno w oknach konsoli usługi, jak i klienta. Możesz zobaczyć, jak usługa odbiera komunikaty od klienta. Naciśnij ENTER w każdym oknie konsoli, aby zamknąć zarówno usługę, jak i klienta.
Klient kończy działanie przed zakończeniem działania usługi, co pokazuje, że nie oczekuje na ukończenie operacji usługi o charakterze jednokierunkowym. 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 / Notatka
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 wywołał operację, blokuje się, 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ć się przy każdym kolejnym wywołaniu 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ą skonfigurowane od InstanceContextMode do PerCall
, aby każdy komunikat mógł być przetworzony przez inną instancję.
ConcurrencyMode jest ustawiony na Multiple
, aby umożliwić więcej niż jednemu wątkowi wysyłanie komunikatów jednocześnie.
Aby skonfigurować, skompilować i uruchomić przykładowy program
Upewnij się, że wykonano procedurę instalacji One-Time dla przykładów programu Windows Communication Foundation.
Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w Kompilowanie przykładów Windows Communication Foundation.
Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w Uruchamianie przykładów programu Windows Communication Foundation.
Uwaga / Notatka
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 prawidłowo zamknąć sesji zabezpieczeń, ponieważ usługa jest niedostępna.