Sdílet prostřednictvím


Jednosměrný

Ukázka Onewaye ukazuje kontakt služby s jednosměrnými operacemi služby. Klient nečeká na dokončení operací služby stejně jako u obousměrných operací služby. Tato ukázka je založená na začínáme 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.

Pokud chcete vytvořit jednosměrný kontrakt služby, definujte kontrakt služby, použijte OperationContractAttribute třídu na každou operaci a nastavte IsOneWay ji tak 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čí před službou a předvádí, ž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 vystavená 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ý volal operace bloky, dokud neobdrží odpověď 202 ze 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ázka se nastaví InstanceContextMode tak PerCall , aby každá zpráva byla zpracována jinou instancí. ConcurrencyMode je nastavena tak, aby Multiple více než jedno vlákno najednou odesílala zprávy.

Nastavení, sestavení a spuštění ukázky

  1. Ujistěte se, že jste pro ukázky windows Communication Foundation provedli jednorázovou instalační proceduru.

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

  3. Pokud chcete spustit ukázku v konfiguraci s jedním nebo více počítači, postupujte podle pokynů v části 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 relaci zabezpečení zavřít čistě, protože služba je pryč.