【发布时间】:2014-07-16 23:57:36
【问题描述】:
这个问题让我困惑了几个小时,我完全没有想法。我有以下远程代码:
private static IRolesAndResourcesManager InternalConnect(string host, string operatorName)
{
string url = string.Format("tcp://{0}:{1}/IProxyFactory", host, ServicePort);
object o = Activator.GetObject(typeof (IProxyFactory), url);
IProxyFactory factory = (IProxyFactory) o;
return factory.CreateRolesAndResourcesManager(operatorName);
}
当从我们的网站中调用它时,它工作正常。但是,我们也从 WCF 托管服务(基本上是控制台应用程序)链接到同一个 DLL。当我从该进程中调用相同的方法时,我在以下行中得到一个异常:
return factory.CreateRolesAndResourcesManager(operatorName); // <-- Exception!
例外是:
System.InvalidCastException: 返回参数的类型无效。\r\n 在 System.Runtime.Remoting.Proxies.RealProxy.ValidateReturnArg(对象 arg, 类型 paramType)
到目前为止,我发现的所有内容都表明存在某种 DLL 不匹配;好像 WCF 进程链接到旧版本的 DLL。但是,我尝试删除每个二进制文件、清理、重建。哎呀,我曾经尝试过删除整个登记并再次从 Subversion 中检查所有内容。我还可以验证CreateRolesAndResourcesManager 方法在Remoting 主机端运行并返回有效数据。
除了 DLL 不匹配之外,还有什么其他因素会导致这种异常吗?有什么方法可以获取有关此错误的更多信息?
更新:
绝对不是 CLR 版本不匹配。所有三个进程(IIS Express、Remoting Host、WCF 进程)都有以下Environment.Version:
{4.0.30319.18444}
Build: 30319
Major: 4
MajorRevision: 0
Minor: 0
MinorRevision: 18444
Revision: 18444
我还以管理员身份运行了 Visual Studio 以及所有进程,以查看是否存在安全问题,但这也不能解决问题。
【问题讨论】:
-
Remoting 是一项遗留技术,保留它是为了与现有应用程序向后兼容,不建议用于新开发。现在应该使用 WCF 或 ASP.NET Web API 开发分布式应用程序。请参阅msdn.microsoft.com/en-us/library/vstudio/xws7132e.aspx 顶部的注释以获取证据。
-
@JohnSaunders - 同意。关于远程处理问题的每一个答案基本上都相当于“你为什么还在使用远程处理?”不幸的是,我们现在没有足够的带宽来更新我们的整个代码库。因此,我们暂时只能使用两者的混合体。
-
“我们现在没有足够的带宽来更新我们的整个代码库。”
bandwith是您打算使用的词吗?对于 BinaryFormatting 和 gzip 压缩之类的东西,如果带宽差异如此之大,我会感到惊讶。 -
我所说的带宽是指人类开发成本。转换我们所有的旧服务需要数周或数月的时间,但我们需要为下一个版本修复此错误。
-
CreateRolesAndResourcesManager 是否真的返回一个 IRolesAndResourcesManager?该错误表明该服务正在尝试返回一个未实现 IRolesAndResourcesManager 的对象。
标签: c# .net wcf .net-remoting