我正在尝试使用IDesign的ServiceModelEx库。当我试着打电话时:
InProcFactory.CreateInstance();
来自WCF服务(基本上从WCF服务A调用WCF服务B),我收到以下错误:
无法找到动态程序集
失败的代码是:
internal static Assembly[] GetWebAssemblies()
{
Debug.Assert(IsWebProcess());
List<Assembly> assemblies = new List<Assembly>();
if(Assembly.GetEntryAssembly() != null)
{
throw new InvalidOperationException("Can only call in a web assembly");
}
foreach(ProcessModule module in Process.GetCurrentProcess().Modules)
{
assemblies.Add(Assembly.LoadFrom(module.FileName));
if (module.ModuleName.StartsWith("App_Code.") && module.ModuleName.EndsWith(".dll"))
{
assemblies.Add(Assembly.LoadFrom(module.FileName));
}
if (module.ModuleName.StartsWith("App_Web_") && module.ModuleName.EndsWith(".dll"))
{
assemblies.Add(Assembly.LoadFrom(module.FileName));
}
}
if (assemblies.Count == 0)
{
throw new InvalidOperationException("Could not find dynamic assembly");
}
return assemblies.ToArray();
}
程序集未使用App_Web或App_Code进行预先修复,因为它不是网站或Web应用程序(它是WCF服务)。但是,如果我从网站,Web应用程序或EXE调用它,代码确实有效。这是deisgn吗?
答案 0 :(得分:1)
在这种情况下,可能没有加载您期望的模块。
答案 1 :(得分:0)
那是通用的解析器摔倒了。它试图最好发现可能在其中包含数据合同的所有程序集,但它是一种军备竞赛,因为不同的托管环境(特别是IIS变体)弹出窗口。动态代码的引入也使生活变得更加困难。
如果您使用最新的ServiceModelEx(SME),则可以修复此问题。只需确保在下载中使用最新的.NET版本(目前为4.6.1),因为较旧的.NET版本下载的SME(例如4.0及更早版本)将不具备这些修复程序。如果需要,您可以降级.NET版本(在限制范围内)。例如。我将4.6.1版本降为4.5.2。
注意:只有在通过Generic Resolver使用数据合同继承时才需要这样做。如果您不需要此功能并且它会导致您出现问题,则可以注释掉有问题的代码。