Sdílet prostřednictvím


One-Way

Ukázkový příklad Oneway demonstruje servisní kontakt s operacemi jednosměrné služby. Klient nečeká na dokončení operací služby, na rozdíl od toho, jak je tomu u operací dvoucestné služby. Tato ukázka je založená na První kroky a používá wsHttpBinding vazbu. Služba v této ukázce je konzolová aplikace v místním prostředí, která umožňuje sledovat službu, která přijímá a zpracovává požadavky. Klient je také konzolová aplikace.

Poznámka:

Postup nastavení a pokyny k sestavení pro tuto ukázku najdete na konci tohoto tématu.

Pro vytvoření jednosměrného kontraktu služby definujte kontrakt služby, použijte třídu OperationContractAttribute pro každou operaci a nastavte IsOneWay na true, jak je znázorněno v následujícím ukázkovém kódu:

[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 bylo vidět, že klient nečeká na dokončení operací služby, kód služby v této ukázce implementuje pětisekundové zpoždění, jak je znázorněno v následujícím ukázkovém kódu:

// 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);
    }
    ...
}

Když klient zavolá službu, volání se vrátí bez čekání na dokončení operace služby.

Při spuštění ukázky se aktivity klienta a služeb zobrazí v oknech služby i konzoly klienta. Můžete vidět, že služba přijímá zprávy od klienta. Stisknutím klávesy ENTER v každém okně konzoly vypnete službu i klienta.

Klient dokončí dříve než služba, což ukazuje, že klient nečeká na dokončení jednosměrných operací služby. Výstup klienta je následující:

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

Press <ENTER> to terminate client.

Zobrazí se následující výstup služby:

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

Poznámka:

HTTP je podle definice protokol požadavku/odpovědi; při provedení požadavku se vrátí odpověď. To platí i pro jednosměrnou operaci služby, která je zveřejněná přes protokol HTTP. Při zavolání operace vrátí služba stavový kód HTTP 202 před spuštěním operace služby. Tento stavový kód znamená, že žádost byla přijata ke zpracování, ale zpracování ještě nebylo dokončeno. Klient, který zahájil operaci, je blokován, dokud neobdrží odpověď 202 od služby. To může způsobit neočekávané chování při odesílání více jednosměrných zpráv pomocí vazby, která je nakonfigurovaná tak, aby používala relace. Vazba wsHttpBinding použitá v této ukázce je nakonfigurovaná tak, aby ve výchozím nastavení používala relace k vytvoření kontextu zabezpečení. Ve výchozím nastavení je zaručeno, že zprávy v relaci dorazí v pořadí, ve kterém se odesílají. Z tohoto důvodu se při odeslání druhé zprávy v relaci nezpracuje, dokud nebude zpracována první zpráva. Výsledkem je, že klient neobdrží odpověď 202 pro zprávu, dokud nebude dokončeno zpracování předchozí zprávy. Klient se proto jeví jako blokovaný při každém následném volání operace. Aby se zabránilo tomuto chování, tato ukázka nakonfiguruje modul runtime tak, aby zprávy odesílal souběžně do různých instancí pro zpracování. Ukázková sada nastaví InstanceContextMode na PerCall tak, aby každá zpráva byla zpracována různými instancemi. ConcurrencyMode je nastaven na Multiple, aby umožnil více než jednomu vláknu současně odesílat zprávy.

Jak nastavit, sestavit a spustit ukázku

  1. Ujistěte se, že jste provedli instalační proceduru One-Time pro ukázky Windows Communication Foundation.

  2. Pokud chcete sestavit verzi C# nebo Visual Basic .NET řešení, postupujte podle pokynů v Sestavení ukázek Windows Communication Foundation.

  3. Pokud chcete spustit ukázku v konfiguraci pro jeden počítač nebo pro více počítačů, postupujte podle pokynů v Spuštění ukázek Windows Communication Foundation.

Poznámka:

Před spuštěním klienta spusťte službu a před vypnutím služby ji vypněte. Tím se zabrání výjimce klienta, když klient nemůže bezpečně uzavřít relaci zabezpečení, protože služba není dostupná.