Je travaille sur un projet en ce moment et je suis un peu coincé. Je crée une application de serveur client, qui permet à un client de s'abonner au serveur pour recevoir des messages. Le problème que j'ai, c'est que lorsque le client s'abonne, je souhaite qu'il reçoive uniquement les mises à jour qui s'y rapportent. Le système transmet essentiellement les messages d'une base de données SQL Server que le serveur surveille. Lorsqu'un nouveau message est reçu, le serveur doit seulement transmettre le message aux clients auxquels il s'applique, en fonction de ce qui a été enregistré sur l'ordinateur client. J'ai regardé et trouvé des exemples de code qui s'inscrivent pour que les messages soient diffusés sur tous les clients qui se sont abonnés, mais pas sur ceux qui montrent comment identifier les clients individuels et si les messages s'appliquent à eux.WCF Publier/S'abonner et utiliser les rappels pour envoyer des données à des utilisateurs spécifiques
Si quelqu'un pouvait m'aider ou me diriger dans la bonne direction, ce serait apprécié.
modifier Pour être plus clair, je ne suis pas tellement se demander comment faire fonctionner callbacks et abonnement, mais comment faire fonctionner un service d'abonnement où lorsqu'un utilisateur est abonné, ils peuvent y fournir des ID utilisateur ainsi que les informations de rappel, ce qui peut ensuite être utilisé pour identifier les utilisateurs spécifiques, les messages doivent être envoyés.
Vous pouvez maintenant trouver certains de mon code ci-dessous:
namespace AnnouncementServiceLibrary
{
[ServiceContract(CallbackContract = typeof(IMessageCallback))]
public interface IMessageCheck
{
[OperationContract]
void MessageCheck();
}
}
namespace AnnouncementServiceLibrary
{
public interface IMessageCallback
{
[OperationContract(IsOneWay = true)]
void OnNewMessage(Mess message);
}
}
Inscription/désinscrire:
private static readonly List<IMessageCallback> subscribers = new List<IMessageCallback>();
public bool Subscribe()
{
try
{
IMessageCallback callback = OperationContext.Current.GetCallbackChannel<IMessageCallback>();
//If they dont already exist in the subscribers list, adds them to it
if (!subscribers.Contains(callback))
subscribers.Add(callback);
return true;
}
catch
{
//Otherwise if an error occurs returns false
return false;
}
}
/// <summary>
/// Unsubscribes the user from recieving new messages when they become avaliable
/// </summary>
/// <returns>Returns a bool that indicates whether the operation worked or not</returns>
public bool Unsubscribe()
{
try
{
IMessageCallback callback = OperationContext.Current.GetCallbackChannel<IMessageCallback>();
//If they exist in the list of subscribers they are then removed
if (subscribers.Contains(callback))
subscribers.Remove(callback);
return true;
}
catch
{
//Otherwise if an error occurs returns false
return false;
}
}
Enfin, ce au moment isnt't travaille comme essentiellement lorsqu'un utilisateur est abonné comme boucles par le biais je veux pour filtrer la requête LINQ basée sur les utilisateurs ID utilisateur:
#region IMessageCheck Members
/// <summary>
/// This method checks for new messages recieved based on those who have subscribed for the service
/// </summary>
public void MessageCheck()
{
//A continuous loop to keep the method going
while(true)
{
//Changes the thread to a sleep state for 2 mins?
Thread.Sleep(200000);
//Go through each subscriber based on there callback information
subscribers.ForEach(delegate(IMessageCallback callback)
{
//Checks if the person who wanted the callback can still be communicated with
if (((ICommunicationObject)callback).State == CommunicationState.Opened)
{
//Creates a link to the database and gets the required information
List<Mess> mess = new List<Mess>();
List<Message> me;
List<MessageLink> messLink;
AnnouncementDBDataContext aDb = new AnnouncementDBDataContext();
me = aDb.Messages.ToList();
messLink = aDb.MessageLinks.ToList();
//Query to retrieve any messages which are newer than the time when the last cycle finished
var result = (from a in messLink
join b in me
on a.UniqueID equals b.UniqueID
where b.TimeRecieved > _time
select new { b.UniqueID, b.Author, b.Title, b.Body, b.Priority, a.Read, b.TimeRecieved });
//Foreach result a new message is created and returned to the PC that subscribed
foreach (var a in result)
{
Mess message = new Mess(a.UniqueID, a.Author, a.Title, a.Body, a.Priority, (bool)a.Read, a.TimeRecieved);
callback.OnNewMessage(message);
}
}
//If the requesting PC can't be contacted they are removed from the subscribers list
else
{
subscribers.Remove(callback);
}
});
//Sets the datetime so the next cycle can measure against to see if new messages have been recieved
_time = DateTime.Now;
}
}
#endregion
Merci beaucoup pour vos idées, lisez votre article et cela correspond à ce que je cherche à faire merci. – manemawanna