如何将字符串从连接到WCF服务的一个客户端推送到另一个连接的客户端?

时间:2010-05-06 19:38:44

标签: c# wcf callback

这是我到目前为止所拥有的:

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

        }
    }
}

只是一个从一个客户端传递到另一个客户端的简单字符串。

2 个答案:

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