WCF i duplex - jak odpowiadac do wszystkich klientow

0

Witam , tworze aplikacje WCF, i mam taki problem. Mianowicie:

  1. Mam podłączonych do servera WCF kilku klientów
  2. gdy jeden z klientów zmienia dane na serverze chce aby kazdy pozostały klient dowiedzial sie o tym. W tym momencie to dziala tak ze callback wraca tylko do klienta ktory wywolal funkcje.
   /// <summary>
    /// service interface
    /// </summary>
    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IServiceClassCallback))]
    public interface IServiceClass
    {
        /// <summary>
        /// Gets the tags.
        /// </summary>
        [OperationContract(IsOneWay = true)]
        void GetTag();

        [OperationContract(IsOneWay = true)]
        void ChangeTag(Tag tag);
    }

    /// <summary>
    /// callback interface
    /// </summary>
    public interface IServiceClassCallback
    {
        [OperationContract(IsOneWay = true)]
        void ReceiveTag(Tag tag);
    }

    /// <summary>
    /// main service class
    /// </summary>
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class ServiceClass : IServiceClass
    {
        /// <summary>
        /// Gets the callback.
        /// </summary>
        public IServiceClassCallback Callback
        {
            get
            { 
                return OperationContext.Current.GetCallbackChannel<IServiceClassCallback>();
            }
        }

        /// <summary>
        /// Gets the tags.
        /// </summary>
        public void GetTag()
        {
            Callback.ReceiveTag(TagHolder.Tag);
            EventHolder.LogRequested(DateTime.Now +" Requested Tag");
        }

        /// <summary>
        /// Changes the tag.
        /// </summary>
        /// <param name="tag">The tag.</param>
        public void ChangeTag(Tag tag)
        {
            TagHolder.Tag.TimeStamp = tag.TimeStamp;
            TagHolder.Tag.Quality = tag.Quality;
            TagHolder.Tag.Value = tag.Value;
            Callback.ReceiveTag(TagHolder.Tag);
            EventHolder.OnTagChanged(tag);
            EventHolder.LogRequested(DateTime.Now + " Tag changed");
        }

to kod servera. Kiedy jeden z klientow wywola ChangeTag, chce zeby kazdy pozostaly podłączony klient otrzymal dokladnie ten sam callback. Jak to zrobic?

0

Musisz przechowywać klientów w jakieś kolekcji. Aby to osiągnąć musi mieć InstanceContextMode ustawione na Single, lub jawnie zarządzać sesjami (parametr IsInitializing oraz IsTemrinating atrybutu ServiceOperation, aktualnie u ciebie tego brak, więc każdy klient będzie miał własną instancję serwisu - w ten sposób tego nie osiągniesz). Wtedy niech w serwisie będzie dostępna metoda wywoływana na powitanie (np otwierająca sesję) i dodasz sobie do kolekcji przychodzący obiekt implementujący IServiceClassCallback. Wtedy w metodzie broadcastujacej do wszystkich po prostu w pętli się przeiteruj po kolekcji i wywołaj odpowiednie metody.

0
siema cześc i czołem napisał(a)

Musisz przechowywać klientów w jakieś kolekcji. Aby to osiągnąć musi mieć InstanceContextMode ustawione na Single, lub jawnie zarządzać sesjami (parametr IsInitializing oraz IsTemrinating atrybutu ServiceOperation, aktualnie u ciebie tego brak, więc każdy klient będzie miał własną instancję serwisu - w ten sposób tego nie osiągniesz). Wtedy niech w serwisie będzie dostępna metoda wywoływana na powitanie (np otwierająca sesję) i dodasz sobie do kolekcji przychodzący obiekt implementujący IServiceClassCallback. Wtedy w metodzie broadcastujacej do wszystkich po prostu w pętli się przeiteruj po kolekcji i wywołaj odpowiednie metody.

Dzieki , mniej wiecej wiem o co chodzi , a masz moze tego jakis przyklad?
Pozdrawiam

0
diseasex napisał(a)
siema cześc i czołem napisał(a)

Musisz przechowywać klientów w jakieś kolekcji. Aby to osiągnąć musi mieć InstanceContextMode ustawione na Single, lub jawnie zarządzać sesjami (parametr IsInitializing oraz IsTemrinating atrybutu ServiceOperation, aktualnie u ciebie tego brak, więc każdy klient będzie miał własną instancję serwisu - w ten sposób tego nie osiągniesz). Wtedy niech w serwisie będzie dostępna metoda wywoływana na powitanie (np otwierająca sesję) i dodasz sobie do kolekcji przychodzący obiekt implementujący IServiceClassCallback. Wtedy w metodzie broadcastujacej do wszystkich po prostu w pętli się przeiteruj po kolekcji i wywołaj odpowiednie metody.

Dzieki , mniej wiecej wiem o co chodzi , a masz moze tego jakis przyklad?
Pozdrawiam
nvm dam se rade , dzieki!!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1