这是我到目前为止所拥有的:
IService:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace ServiceLibrary
{
[ServiceContract(SessionMode = SessionMode.Allowed, CallbackContract = typeof(IServiceCallback))]
public interface IService
{
[OperationContract(IsOneWay = false, IsInitiating = true, IsTerminating = false)]
void Join(string userName);
}
interface IServiceCallback
{
[OperationContract(IsOneWay = true)]
void UserJoined(string senderName);
}
}
服务:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace ServiceLibrary
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service:IService
{
IServiceCallback callback = null;
public void Join(string userName)
{
callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
}
}
}
只是一个从一个客户端传递到另一个客户端的简单字符串。
答案 0 :(得分:1)
除非您使用点对点绑定,否则您无法主动将字符串从一个WCF客户端“推送”到另一个WCF客户端。
但是您尝试做的似乎与发布/订阅模型有些相似:一个节点发布信息(服务器 - 可能从其中一个客户端获取),然后接收任意数量的订阅者那个信息。
WCF中有很多方法可以解决这个问题 - 双工通信,MSMQ或Windows Azure ServiceBus消息传递 - 方法各不相同。
以下是一些有各种方法可以帮助您入门的文章:
但是当您在Google或Bing上搜索“WCF发布订阅模式”时,您会发现更多内容。
答案 1 :(得分:0)
看起来您已经使用了双面打包。只需在一些静态集合中保留一个回调列表(订阅者)(静态,因为您使用每个会话实例)。当某人调用“join”时,只需遍历该集合并为每个订阅者调用UserJoined
。
private static List<IServiceCallback> subscribers = new List<IServiceCallback>();
public void Join(string userName)
{
IServiceCallback callback = OperationContext.Current.GetCallbackChannel<IServiceCallback>();
foreach (var serviceCallback in subscribers)
{
serviceCallback.UserJoined(userName);
}
subscribers.Add(callback);
}