wcf - 使用 RealProxy 包装多个 WCF 连接

标签 wcf expression realproxy

我正在开发一个项目,其中我们的服务器与公开相同接口(interface)的多个服务器进行通信(如在集群中)。我们使用循环法来选择将请求发送到哪个服务器。到目前为止,我们一直在使用 Expression 来调用 ClusterManager,但这会导致一些丑陋的代码。它还使单元测试变得困惑,并且验证方法参数有点困难。这似乎也会导致起订量出现一些随机异常的问题(不是本文的主题)。

我目前调用服务器和单元测试,如帖子 Moq Setup for interface with action or function arguments 中所述。

进入正题:

我目前有以下方法:

public interface IServerAdapter 
{
    void CallServer(Expression<Action<IServerExposingToClient>> methodToCall, out bool serverCalled);
}

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

我想将其更改为以下内容:

public interface IServerAdapter 
{
    IServerExposingToClient ServerProxy { get; }
}

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

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

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

想法 2 获取我当前用于调用服务器的WCF连接的TransparentProxy的RealProxy,并使用我拥有的消息直接调用Invoke。在我的试用中(使用集成测试),我似乎能够成功调用服务器,但是查看ReturnMessage,没有返回值,并且当ServiceChannelProxy尝试获取消息数据时,Exception属性被设置为ArithmetricException。这可能是因为我在测试中做错了什么,或者是因为我无法在两个单独的代理上使用相同的 LogicalCallContext (或其他内容)。

有关于如何处理这个问题的指导吗?我更喜欢 Idea 2,因为它看起来最简单,并且希望代码量最少。我不想在类中实现 IServerExformingToClient 中的所有方法以在正确的服务器上调用。

有关于如何处理这个问题的指导吗?

最佳答案

使用找到的信息here ,我已经能够解决这个问题了。在下面的代码中,代理是 WCF 服务 channel 的 ICommunicationObject。看起来效果很好。

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

关于wcf - 使用 RealProxy 包装多个 WCF 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13754682/

相关文章:

c# - 如何为高级搜索屏幕构建自定义表达式

c# - 在什么情况下 `RealProxy.GetTransparentProxy()` 会返回 `null` ?

asp.net-mvc - 处置 WCF 代理的正确方法是什么?

c# - 自托管 WCF 服务是否受到任何限制?

c# - http工作时如何测试WCF net.tcp?

windows - 关于 WCF 服务总线

c# - 在另一个代理中包装 RemotingProxy 的 __TransparentProxy 抛出 RemotingException

wcf - HttpContext.Current.User 始终为空

vb.net - 用于循环类属性的 Lambda 表达式

expression - 是println!表达或陈述?