Aracılığıyla paylaş


Tasarım Desenleri: Liste Tabanlı Yayımlama-Abone Olma

ListBasedPublishSubscribe örneği, Bir Windows Communication Foundation (WCF) programı olarak uygulanan Liste Tabanlı Yayımla-Abone Ol desenini gösterir.

Not

Bu örnek için kurulum yordamı ve derleme yönergeleri bu konunun sonunda yer alır.

Liste Tabanlı Yayımla-Abone Ol tasarım deseni, Microsoft Desenleri ve Uygulamaları yayını, Tümleştirme Desenleri'nde açıklanmıştır. Yayımla-Abone Ol düzeni, bilgileri bir bilgi konusuna abone olan alıcı koleksiyonuna geçirir. Liste tabanlı yayımlama-abone olma, abonelerin listesini tutar. Paylaşacak bilgiler olduğunda, listedeki her aboneye bir kopya gönderilir. Bu örnek, istemcilerin gerektiği sıklıkta abone olabileceği veya abonelikten çıkabileceği dinamik liste tabanlı yayımlama-abone olma deseni gösterir.

Liste Tabanlı Yayımla-Abone Ol örneği bir istemci, hizmet ve bir veri kaynağı programından oluşur. Birden fazla istemci ve çalışan birden fazla veri kaynağı programı olabilir. İstemciler hizmete abone olur, bildirimler alır ve aboneliği iptal eder. Veri kaynağı programları, mevcut tüm abonelerle paylaşılacak bilgileri hizmete gönderir.

Bu örnekte, istemci ve veri kaynağı konsol programlarıdır (.exe dosyalar) ve hizmet, Internet Information Services'te (IIS) barındırılan bir kitaplıktır (.dll). İstemci ve veri kaynağı etkinliği masaüstünde görünür.

Hizmet çift yönlü iletişim kullanır. ISampleContract Hizmet sözleşmesi bir ISampleClientCallback geri çağırma sözleşmesiyle eşleştirilir. Hizmet, istemcilerin abone listesine katılmak veya listeden çıkmak için kullandığı Abone Ol ve Aboneliği Kaldır hizmet işlemlerini uygular. Hizmet ayrıca, veri kaynağı programının hizmete yeni bilgiler sağlamak için çağırdığı hizmet işlemini de uygular PublishPriceChange . İstemci programı, hizmetin fiyat değişikliğini PriceChange tüm abonelere bildirmek için çağırdığı hizmet işlemini uygular.

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

Hizmet, tüm aboneleri yeni bilgiler hakkında bilgilendirmek için mekanizma olarak bir .NET Framework olayı kullanır. İstemci Abone Ol çağrısı yaparak hizmete katıldığında bir olay işleyicisi sağlar. İstemci ayrıldığında, olay işleyicisinin aboneliğini olaydan kaldırır. Bir veri kaynağı bir fiyat değişikliğini bildirmek için hizmeti çağırdığında, hizmet olayı başlatır. Bu, abone olan her istemci için bir tane olmak üzere hizmetin her örneğini çağırır ve olay işleyicilerinin yürütülmesine neden olur. Her olay işleyicisi, geri çağırma işlevi aracılığıyla bilgileri istemcisine geçirir.

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

    }

Örneği çalıştırdığınızda birkaç istemci başlatın. İstemciler hizmete abone olur. Ardından hizmete bilgi gönderen veri kaynağı programını çalıştırın. Hizmet, bilgileri tüm abonelere geçirir. Bilgilerin alındığını onaylayan her istemci konsolunda etkinlik görebilirsiniz. İstemciyi kapatmak için istemci penceresinde ENTER tuşuna basın.

Örneği ayarlamak ve derlemek için

  1. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'nı gerçekleştirdiğinizden emin olun.

  2. Çözümün C# veya Visual Basic .NET sürümünü oluşturmak için Windows Communication Foundation Örnekleri Oluşturma başlığındaki yönergeleri izleyin.

Örneği aynı makinede çalıştırmak için

  1. Aşağıdaki adresi girerek bir tarayıcı kullanarak hizmete erişebildiğinizi test edin: http://localhost/servicemodelsamples/service.svc. Yanıt olarak bir onay sayfası görüntülenmelidir.

  2. \client\bin\ konumundan, dile özgü klasörün altından Client.exe çalıştırın. İstemci etkinliği, istemci konsolu penceresinde görüntülenir. Birkaç istemci başlatın.

  3. \datasource\bin\ konumundan dile özgü klasörün altından Datasource.exe çalıştırın. Konsol penceresinde veri kaynağı etkinliği görüntülenir. Veri kaynağı hizmete bilgi gönderdikten sonra, her istemciye geçirilmelidir.

  4. İstemci, veri kaynağı ve hizmet programları iletişim kuramıyorsa bkz. WCF Örnekleri için sorun giderme İpuçları.

Örneği makineler arasında çalıştırmak için

  1. Hizmet makinesini ayarlayın:

    1. Hizmet makinesinde ServiceModelSamples adlı bir sanal dizin oluşturun. Windows Communication Foundation Örnekleri için Tek Seferlik Kurulum Yordamı'ndan Setupvroot.bat toplu iş dosyası, disk dizini ve sanal dizini oluşturmak için kullanılabilir.

    2. Hizmet programı dosyalarını %SystemDrive%\Inetpub\wwwroot\servicemodelsamples konumundan hizmet makinesindeki ServiceModelSamples sanal dizinine kopyalayın. Dosyaları \bin dizinine eklediğinizden emin olun.

    3. Bir tarayıcı kullanarak istemci makinesinden hizmete erişebildiğinizi test edin.

  2. İstemci makinelerini ayarlayın:

    1. \client\bin\ klasöründeki, dile özgü klasörün altındaki istemci program dosyalarını istemci makinelerine kopyalayın.

    2. Her istemci yapılandırma dosyasında uç nokta tanımının adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin. "localhost"a yapılan başvuruları adreste tam etki alanı adıyla değiştirin.

  3. Veri kaynağı makinesini ayarlayın:

    1. \datasource\bin\ klasöründeki, dile özgü klasörün altındaki veri kaynağı program dosyalarını veri kaynağı makinesine kopyalayın.

    2. Veri kaynağı yapılandırma dosyasında uç nokta tanımının adres değerini hizmetinizin yeni adresiyle eşleşecek şekilde değiştirin. "localhost"a yapılan başvuruları adreste tam etki alanı adıyla değiştirin.

  4. İstemci makinelerinde bir komut isteminden Client.exe başlatın.

  5. Veri kaynağı makinesinde bir komut isteminden Datasource.exe başlatın.