mon premier Serveur WCF - pourquoi OperationContext.Le courant est nulle?
Je suis tring pour mettre en œuvre mon premier WCF retour d'appel serveur. C'est mon code:
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ILogCallback))]
public interface ILog
{
}
public interface ILogCallback
{
[OperationContract(IsOneWay = true)]
void Push(string callbackValue);
}
public class MyLog : ILog
{
}
class Log
{
public static void initialize()
{
using (ServiceHost host = new ServiceHost(
typeof (MyLog),
new Uri[]
{
new Uri("net.pipe://localhost")
}))
{
host.AddServiceEndpoint(typeof (ILog),
new NetNamedPipeBinding(),
"PipeReverse");
host.Open();
//TODO: host.Close();
}
}
public static void Push(string s)
{
ILogCallback callbacks = OperationContext.Current.GetCallbackChannel<ILogCallback>();
callbacks.Push(s);
}
}
alors j'essaie d'utiliser mon serveur à l'aide de ce code:
Log.initialize();
while (true)
{
Log.Push("Hello");
System.Threading.Thread.Sleep(1000);
}
Mais j'ai eu des NPE, parce que OperationContext.Le courant est nul. Pourquoi, quel est le problème et comment le corriger?
OriginalL'auteur javapowered | 2011-09-10
Vous devez vous connecter pour publier un commentaire.
Parce que vous n'êtes PAS dans le contexte d'une opération.
Vous êtes tout simplement l'appel d'une méthode statique de la classe de Log.
Pour vous d'être dans un Contexte d'Opération de votre appel DOIT avoir été à venir à partir d'un client qui est desservie par votre serveur WCF.
Log.Push
sur les Clients. C'est pourquoi j'ai utilisé le "rappel" de la méthode...Que, fondamentalement signifie que vous voulez que votre client à un serveur. L'utilisation de la plaine simplex de communication, pas besoin de rappels.
hm ce qui est "clair simplex de communication"? Vous pensez que je ne devrais pas utiliser WCF? J'ai juste besoin de propager les journaux d'un serveur à plusieurs clients, remarque mon autre question stackoverflow.com/questions/7370423/...
L'utilisation d'un simple modèle d'échange de messages. Il suffit de configurer un service (sur votre "client") qui permettra de répondre à passer des appels. Ne pas utiliser de doubles liaisons et de rappel des contrats.
le CallbackContract nécessite canal duplex, c'est à dire un canal qui est activement utilisé par les deux parties. Duplex de sons sur bon pour vos besoins, mais il exige que vos clients se connecte à votre serveur et fournit la fonction de rappel. Gardez à l'esprit que pour les liaisons http la communication doit se faire dans une session, et pour net.tpc vous pouvez simplement garder la connexion ouverte. Ajoutez une méthode de connexion, à votre service, et l'appel du client, la fourniture de ses mise en œuvre de la fonction de rappel. Puis garder la session/ouvrir le canal jusqu'à ce que le client est plus intéressé par les messages du journal
OriginalL'auteur Paulo Santos
OperationContext.Current
est un fil-propriété statique qui est initialisé lors de l'arrivée des demandes vers le serveur. Voici ce que vous devez faire pour appeler la fonction de rappelPushOnTheClient
méthode? Je n'ai pas besoin des clients à appeler toutes les méthodes de serveur. J'ai besoin de serveur pour des clients d'appel de méthodes. Le serveur doit journaux de poste pour les clientsCela signifie que vous devez inverser les rôles. Celui qui choisit quand et comment appeler le client.
Alors je vais en avoir un client (qui produit les journaux) et plusieurs serveurs (qui doit recevoir les journaux). Chaque fois qu'un nouveau serveur est ajouté-je besoin de modifier le client pour fixer à nouveau serveur. C'est très bizarre, j'ai besoin d'typique "abonnés" modèle.... Je ne veux pas modifier la partie qui produit des journaux à chaque fois que je attacher ou de détacher la partie à l'écoute pour les journaux
Voir ma réponse: stackoverflow.com/questions/7370423/...
OriginalL'auteur Dmitry Ornatsky
Il vous manque le souscripteur de l'abonnement. La façon dont vous le faire est de créer un [oneway] l'opération dans votre Monjournal WCF serveur appelé quelque chose comme: "
void SendMeLogs()
".Cela va ouvrir le rappel de client canal. Ensuite, vous aurez à mettre en œuvre
SendMeLogs()
dans les lignes de quelque chose comme:Depuis le
SendMeLogs()
fonction est unidirectionnelle, le client ne sera pas un bloc, mais l'abonnement à votre journal du serveur. (vous pouvez chercher sur le net pour un exemple de code pour le duplex la calculatrice dans la wcf pour un bon exemple de cette architecture).La clé, cependant, est que vous devez avoir une belle de désabonnement de la méthode comme "
StopSendingMeLogs
de" briser la boucle, et aussi faire lePushOnTheClient
fonction fail safe, dans le cas où le client met fin ou la connexion de client spécifique va vers le bas.Le "
CheckLogsForNewData
" de la fonction, idéalement, devrait être partagé (statique) de la mise en œuvre dans votre casOriginalL'auteur bobby