Sdílet prostřednictvím


Vzory návrhu: publikování–odběr založený na seznamu

Ukázka ListBasedPublishSubscribe znázorňuje model publikování a odběru založený na seznamu implementovaný jako program WCF (Windows Communication Foundation).

Poznámka:

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

Model návrhu publikování a odběru založený na seznamu je popsaný v publikaci Microsoft Patterns &Practices, Vzory integrace. Model Publikování a přihlášení k odběru předává informace kolekci příjemců, kteří se přihlásili k odběru informačního tématu. Odběr publikování na základě seznamu udržuje seznam odběratelů. Pokud jsou k dispozici informace ke sdílení, kopie se odešle každému odběrateli v seznamu. Tato ukázka ukazuje dynamický model publikování a odběru založeného na seznamu, kde se klienti můžou přihlásit k odběru nebo odběru odběru tak často, jak je to potřeba.

Ukázka publikování a odběru na základě seznamu se skládá z klienta, služby a programu zdroje dat. Spuštěných může být více než jeden klient a více než jeden program zdroje dat. Klienti se přihlásí k odběru služby, obdrží oznámení a odhlásí odběr. Programy zdrojů dat odesílají informace do služby, které se mají sdílet se všemi aktuálními odběrateli.

V této ukázce jsou klientem a zdrojem dat konzolové programy (.exe soubory) a služba je knihovna (.dll) hostovaná v Internetová informační služba (IIS). Aktivita klienta a zdroje dat se zobrazují na ploše.

Služba používá duplexní komunikaci. Kontrakt ISampleContract služby je spárovaný se kontraktem zpětného ISampleClientCallback volání. Služba implementuje operace přihlášení k odběru a odhlášení odběru, které klienti používají k připojení nebo opuštění seznamu odběratelů. Služba také implementuje PublishPriceChange operaci služby, kterou program zdroje dat volá, aby služba poskytovala nové informace. Klientský program implementuje PriceChange operaci služby, kterou služba volá, aby informovala všechny předplatitele o změně ceny.

// Create a service contract and define the service operations.
// NOTE: The service operations must be declared explicitly.
[ServiceContract(SessionMode=SessionMode.Required,
      CallbackContract=typeof(ISampleClientContract))]
public interface ISampleContract
{
    [OperationContract(IsOneWay = false, IsInitiating=true)]
    void Subscribe();
    [OperationContract(IsOneWay = false, IsTerminating=true)]
    void Unsubscribe();
    [OperationContract(IsOneWay = true)]
    void PublishPriceChange(string item, double price,
                                     double change);
}

public interface ISampleClientContract
{
    [OperationContract(IsOneWay = true)]
    void PriceChange(string item, double price, double change);
}

Služba jako mechanismus používá událost rozhraní .NET Framework k informování všech odběratelů o nových informacích. Když se klient připojí ke službě voláním přihlásit k odběru, poskytne obslužnou rutinu události. Když klient odejde, zruší odběr obslužné rutiny události z události. Když zdroj dat zavolá službu, aby nahlásila změnu ceny, služba vyvolá událost. Tato funkce volá každou instanci služby, jednu pro každého klienta, který se přihlásil k odběru, a způsobí spuštění obslužných rutin událostí. Každá obslužná rutina události předává informace klientovi prostřednictvím funkce zpětného volání.

public class PriceChangeEventArgs : EventArgs
    {
        public string Item;
        public double Price;
        public double Change;
    }

    // The Service implementation implements your service contract.
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
    public class SampleService : ISampleContract
    {
        public static event PriceChangeEventHandler PriceChangeEvent;
        public delegate void PriceChangeEventHandler(object sender, PriceChangeEventArgs e);

        ISampleClientContract callback = null;

        PriceChangeEventHandler priceChangeHandler = null;

        //Clients call this service operation to subscribe.
        //A price change event handler is registered for this client instance.

        public void Subscribe()
        {
            callback = OperationContext.Current.GetCallbackChannel<ISampleClientContract>();
            priceChangeHandler = new PriceChangeEventHandler(PriceChangeHandler);
            PriceChangeEvent += priceChangeHandler;
        }

        //Clients call this service operation to unsubscribe.
        //The previous price change event handler is unregistered.

        public void Unsubscribe()
        {
            PriceChangeEvent -= priceChangeHandler;
        }

        //Information source clients call this service operation to report a price change.
        //A price change event is raised. The price change event handlers for each subscriber will execute.

        public void PublishPriceChange(string item, double price, double change)
        {
            PriceChangeEventArgs e = new PriceChangeEventArgs();
            e.Item = item;
            e.Price = price;
            e.Change = change;
            PriceChangeEvent(this, e);
        }

        //This event handler runs when a PriceChange event is raised.
        //The client's PriceChange service operation is invoked to provide notification about the price change.

        public void PriceChangeHandler(object sender, PriceChangeEventArgs e)
        {
            callback.PriceChange(e.Item, e.Price, e.Change);
        }

    }

Při spuštění ukázky spusťte několik klientů. Klienti se přihlásí k odběru služby. Potom spusťte program zdroje dat, který odesílá informace do služby. Služba předává informace všem odběratelům. U každé konzoly klienta můžete zobrazit aktivitu, která potvrzuje, že informace byly přijaty. Stisknutím klávesy ENTER v okně klienta klienta ukončete klienta.

Nastavení a sestavení 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.

Spuštění ukázky na stejném počítači

  1. Otestujte, že ke službě můžete přistupovat pomocí prohlížeče zadáním následující adresy: http://localhost/servicemodelsamples/service.svc. V odpovědi by se měla zobrazit potvrzovací stránka.

  2. Spusťte Client.exe ze složky \client\bin\, ze složky specifické pro jazyk. Aktivita klienta se zobrazí v okně konzoly klienta. Spusťte několik klientů.

  3. Spusťte Datasource.exe ze složky \datasource\bin\, ze složky specifické pro daný jazyk. Aktivita zdroje dat se zobrazí v okně konzoly. Jakmile zdroj dat odešle informace do služby, měl by být předán každému klientovi.

  4. Pokud klient, zdroj dat a programy služeb nemůžou komunikovat, přečtěte si téma Řešení potíží Tipy pro ukázky WCF.

Spuštění ukázky napříč počítači

  1. Nastavení počítače služby:

    1. Na počítači služby vytvořte virtuální adresář s názvem ServiceModelSamples. Dávkový soubor Setupvroot.bat z jednorázového instalačního postupu pro ukázky windows Communication Foundation lze použít k vytvoření adresáře disku a virtuálního adresáře.

    2. Zkopírujte soubory programu služby z %SystemDrive%\Inetpub\wwwroot\servicemodelsamples do virtuálního adresáře ServiceModelSamples na počítači služby. Nezapomeňte zahrnout soubory do adresáře \bin.

    3. Otestujte, že ke službě máte přístup z klientského počítače pomocí prohlížeče.

  2. Nastavení klientských počítačů:

    1. Zkopírujte soubory klientského programu ze složky \client\bin\ ve složce specifické pro jazyk do klientských počítačů.

    2. V každém konfiguračním souboru klienta změňte hodnotu adresy definice koncového bodu tak, aby odpovídala nové adrese vaší služby. Nahraďte všechny odkazy na localhost plně kvalifikovaným názvem domény v adrese.

  3. Nastavení počítače zdroje dat:

    1. Zkopírujte soubory programu zdroje dat ze složky \datasource\bin\ ve složce specifické pro jazyk do počítače zdroje dat.

    2. V konfiguračním souboru zdroje dat změňte hodnotu adresy definice koncového bodu tak, aby odpovídala nové adrese vaší služby. Nahraďte všechny odkazy na localhost plně kvalifikovaným názvem domény v adrese.

  4. Na klientských počítačích spusťte Client.exe z příkazového řádku.

  5. Na počítači zdroje dat spusťte Datasource.exe z příkazového řádku.