[英]Can I use WCF duplex binding to relay message?
我有一个客户端应用程序,一个服务器和另一个客户端,可以称之为第三方。 我的合同中有一个回调接口,该接口由第三方和客户端共同实施。
第三方将调用服务器操作(方法),然后服务器将触发回调,但不是调用第三方的回调,而是调用客户端的回调实现。
是的,您绝对可以做到。
最简单的方法是将服务实现为PerSession服务,并在初始化/构造时捕获回调上下文。 通常,我会将服务对象(实际上表示该时刻的连接)添加到内部核心对象。
然后,当您收到来自客户端的消息时,您可以调用任何服务对象(而不是通过合同),并在内部将数据转发到关联的客户端。
这是该概念的极小的实现,没有异常处理,并且有一些非常糟糕的设计(静态类BAD!)。 我还没有对此进行测试,但是即使我错过了穿越i或打t的原则,这些原则也应该成立。 此示例还将呼叫转发给所有客户端,但是选择单个客户端遵循相同的基本模式。
尝试使用单例服务来做到这一点将更加困难,并且按呼叫的服务显然不起作用:)
[ServiceContract(CallbackContract = typeof(ICallback))]
public interface IContract
{
[OperationContract(IsOneWay = true)]
void SendTheData(string s);
}
public interface ICallback
{
[OperationContract(IsOneWay = true)]
void ForwardTheData(string s);
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.PerSession)]
public class ServiceConnection : IContract
{
private ICallback m_callback;
public ServiceConnection()
{
m_callback = OperationContext.Current.GetCallbackChannel<ICallback>();
ServiceCore.Add(this);
}
public void SendTheData(string s)
{
ServiceCore.DataArrived(s);
}
public void SendToClient(string s)
{
m_callback.ForwardTheData(s);
}
}
static public class ServiceCore
{
static private List<ServiceConnection> m_connections = new List<ServiceConnection>();
public static void DataArrived(string s)
{
foreach(ServiceConnection conn in m_connections)
{
conn.SendTheData(s);
}
}
public static void Add(ServiceConnection connection)
{
m_connections.Add(connection);
}
}
从Microsoft Duplex服务文档的快速阅读中,我认为这不会满足您的要求。 可能还有其他一些聪明的功夫WCF方式,但是在我的情况下,我为服务器创建了一个“ PassThruService”,该服务器实现了与真实服务相同的合同,并将收到的所有请求发送到客户端。
这是我的代码的一部分,解释了它的目的。
private const int OPERATION_TIMEOUT = 5000;
private MyServiceClient m_client = new MyServiceClient();
public bool IsAlive() {
try {
logger.Debug("PassThruService IsAlive.");
bool isAlive = false;
ManualResetEvent isAliveMRE = new ManualResetEvent(false);
m_client.IsAliveComplete += (s, a) => { isAlive = a.Result; isAliveMRE.Set(); };
m_client.IsAliveAsync();
if (isAliveMRE.WaitOne(OPERATION_TIMEOUT)) {
return isAlive;
}
else {
throw new TimeoutException();
}
}
catch (Exception excp) {
logger.Error("Exception PassThruService IsAlive. " + excp.Message);
throw;
}
我没有完全看到您在这里真正要问的问题。...但是无论如何我都会尝试给出一些提示。
在.NET 3.5中的WCF中,中继消息或路由不是很受支持-那里有基础结构,但是手动设置它仍然需要大量工作。
关于.NET 3.5中WCF的这个主题,我所知道的最好的介绍是MSDN杂志上的Michele Leroux Bustamante的两部分文章:
第2部分有一个关于双工路由器的部分-完全可以帮助您完成任务吗?
.NET 4.0中的WCF承诺将提供对路由的附加支持-将有一个RoutingService
基类,可以利用该基类来编写路由服务,并且它将允许可配置的,基于内容或基于元数据的路由-无论您需要什么。
.NET 4.0计划于今年晚些时候(2009年)发布-希望! 因此,尽管这仍然是未来,但它看起来还是美好的!
渣
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.