【问题标题】:Throwing an exception on a remoting server not defined in the client causes an "Unable to find assembly" exception在客户端中未定义的远程服务器上引发异常会导致“无法找到程序集”异常
【发布时间】:2021-01-27 00:19:18
【问题描述】:

我有一些客户端代码通过远程调用一个方法

myProxy = (IProxy)Activator.GetObject(
                    typeof(IProxy),
                    "tcp://" + address + ":" + theControllerPort + "/Proxy");

IProxy 定义为

    public interface IProxy  {
        void DoStuff();
    }

代理被定义为

    public class Proxy : MarshalByRefObject, IProxy {
        public void DoStuff() {
            throw new DerivedException();
        }
    }

我有一个名为 DerivedException 的异常定义为

    [Serializable]
    public class DerivedException: ApplicationException {
        public DerivedException() : base () { }

        public DerivedException(string message) : base (message) { }
        public DerivedException(string message, Exception innerException) : base (message, innerException) { }
        protected DerivedException(SerializationInfo info, StreamingContext context) : base(info, context) { }
    }

当我调用 myProxy.DoStuff()

try{
    result = myProxy.DoStuff();
}
catch (Exception ex) {
    myLog.Error("Error", ex);
}

我得到一个例外:

"Unable to find assembly 'xyz, Version=123, Culture=neutral, PublicKeyToken=null'."

  at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
...

我认为我的客户端代码应该能够反序列化抛出的 DerivedException,因为 DerivedException 继承自 Exception,并且客户端代码设置为捕获 Exception。我在这里做错了什么?如果我在客户端代码的 bin/debug 文件夹中包含定义 DerivedException 的 .dll,则客户端会正确接收异常。有没有其他方法可以让这个异常反序列化并被客户端代码正确捕获?

【问题讨论】:

    标签: c# remoting


    【解决方案1】:

    该问题与您的Proxy 派生自MarshalByRefObject 这一事实有关,并且在这种情况下,对象引用从一个应用程序域传递到另一个应用程序域,而不是对象本身。

    另一方面,您的DerivedException 被标记为Serializable。当类被标记为Serializable 时,它将自动被序列化,从一个应用程序域传输到另一个应用程序域,然后反序列化以在第二个应用程序域中生成对象的精确副本。

    我会尝试将Proxy 类标记为Serializable。当此对象与远程处理一起使用时,负责序列化的格式化程序会控制序列化过程,并用代理替换从MarshalByRefObject 派生的所有对象。

    【讨论】:

    • 谢谢。然而这并没有奏效。我仍然遇到同样的错误。
    【解决方案2】:

    您还需要在客户端上定义DerivedException 的程序集:在服务器上引发异常,序列化并发送到客户端。客户需要知道DerivedException是什么。

    处理它的一种常见方法是在客户端和服务器上都安装一个共享程序集,您可以使用为此定义IProxy 的相同程序集

    相反,定义Proxy的程序集只需要在服务器中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多