首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用RealProxy包装多个WCF连接

使用RealProxy包装多个WCF连接
EN

Stack Overflow用户
提问于 2012-12-06 23:44:23
回答 1查看 644关注 0票数 2

我正在从事一个项目,在这个项目中,我们的服务器与几个服务器进行通信,公开相同的接口(如集群)。我们使用循环来选择发送请求的服务器。到目前为止,我们一直在使用表达式来调用我们的ClusterManager,但是这会导致一些丑陋的代码。它还使单元测试变得混乱,而且验证方法参数也有点困难。它似乎也导致了一些问题与莫克随机例外(不是本帖子的主题)。

我现在调用服务器和单元测试,如post 带有动作或函数参数的接口的Moq设置中所记录的那样

直截了当:

我目前有以下方法:

代码语言:javascript
复制
public interface IServerAdapter 
{
    void CallServer(Expression<Action<IServerExposingToClient>> methodToCall, out bool serverCalled);
}

private void DoSomething()
{
    MainViewModel.ServerAdapter.CallServer(server => server.SaveServerSettings(ServerSettings));
}

我想将其修改如下:

代码语言:javascript
复制
public interface IServerAdapter 
{
    IServerExposingToClient ServerProxy { get; }
}

private void DoSomething()
{
    MainViewModel.ServerAdapter.ServerProxy.SaveServerSettings(ServerSettings);
}

ServerProxy是一个RealProxy,我需要将这个调用转换为ClusterManager来执行对服务器的实际调用。目前,ClusterManager对CallServer具有相同的签名,这对于现有的实现来说有点多余。对于调用调用(IMessage)的转换,我有两个想法。

Idea 1将IMethodCallMessage转换为lamda表达式(我还不知道该如何做)并将其传递给ClusterManager。除了我不知道如何创建表达式并再次处理返回值的问题外。有些方法返回值,而另一些方法则不返回值,因此这涉及到保持ClusterManager.CallServer的多个重载。我还需要创建IMessage以从Invoke返回。

Idea 2获取当前用于调用服务器的WCF连接的TransparentProxy的RealProxy,并使用我拥有的消息直接调用Invoke。在我的试用版(使用集成测试)中,我似乎能够成功地调用服务器,但通过ReturnMessage,没有返回值,当ServiceChannelProxy试图获取消息数据时,异常属性设置为ArithmetricException。这可能是因为我在测试中做错了什么,或者我不能在两个独立的代理上使用相同的LogicalCallContext (或其他什么)。

对如何处理这件事有什么建议吗?我更喜欢Idea 2,因为它看起来是最简单的,并且希望产生最少的代码。在一个类中实现IServerExposingToClient中的所有方法以调用正确的服务器不是我想要做的事情。

对如何处理这件事有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-14 22:07:59

利用发现的这里信息,我已经解决了这个问题。在下面的代码中,代理是指向WCF服务的通道的ICommunicationObject。似乎运作得很好。

代码语言:javascript
复制
public override IMessage Invoke(IMessage msg)
{
    var methodCall = (IMethodCallMessage)msg;
    var proxy = FindNextProxy();
    try
    {
        MethodBase methodBase = methodCall.MethodBase;
        object[] args = methodCall.Args;
        object returnValue = methodBase.Invoke(proxy, args);
        return CreateReturnMessage(returnValue, methodCall);
    }
    catch (TargetInvocationException ex)
    {
        return CreateReturnMessage(ex.InnerException, methodCall);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13754682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档