从WCF服务调用InProcProxyFactory.CreateInstance

从WCF服务调用InProcProxyFactory.CreateInstance,wcf,proxy,proxyfactory,servicemodelex,Wcf,Proxy,Proxyfactory,Servicemodelex,我正在尝试使用IDesign的ServiceModelEx库。当我试着打电话时: InProcFactory.CreateInstance() 从WCF服务中的with(基本上从WCF服务a调用WCF服务B),我得到以下错误: 找不到动态程序集 失败的代码是: internal static Assembly[] GetWebAssemblies() { Debug.Assert(IsWebProcess()); List<Assembly> assemb

我正在尝试使用IDesign的ServiceModelEx库。当我试着打电话时:

InProcFactory.CreateInstance()

从WCF服务中的with(基本上从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();
  }
内部静态程序集[]GetWebAssemblys()
{
Assert(IsWebProcess());
列表程序集=新列表();
if(Assembly.GetEntryAssembly()!=null)
{  
抛出新的InvalidOperationException(“只能在web程序集中调用”);
}
foreach(Process.GetCurrentProcess().Modules中的ProcessModule模块)
{
Add(Assembly.LoadFrom(module.FileName));
if(module.ModuleName.StartsWith(“应用程序代码”)&&module.ModuleName.EndsWith(“.dll”))
{
Add(Assembly.LoadFrom(module.FileName));
}
if(module.ModuleName.StartsWith(“App_Web”)和&module.ModuleName.EndsWith(“.dll”))
{
Add(Assembly.LoadFrom(module.FileName));
}
}
如果(assemblies.Count==0)
{
抛出新的InvalidOperationException(“找不到动态程序集”);
}
返回程序集。ToArray();
}

程序集不是用App_Web或App_代码预先固定的,因为这不是网站或Web应用程序(它是WCF服务)。但是,如果我从网站、web应用程序或EXE调用该代码,它确实可以工作。这是deisgn提供的吗?

可能在这种情况下,您期望的模块根本没有加载。

这就是通用解析器。它试图尽最大努力发现所有可能包含数据协定的程序集,但随着不同托管环境(特别是IIS变体)的弹出,这有点像军备竞赛。动态代码的引入也使生活更加困难

如果您使用最新的ServiceModelEx(SME),它有解决此问题的修复程序。只需确保您在下载中使用最新的.NET版本(当前为4.6.1),因为SME的较旧.NET版本下载(例如4.0和更早版本)不会有这些修复。如果需要,可以降级.NET版本(在限制范围内)。例如,我把4.6.1版本降到了4.5.2


注意:仅当您通过通用解析器使用数据协定继承时才需要此选项。如果您不需要此功能,并且它会导致您出现问题,您可以注释掉有问题的代码。

否,如果我查看Process.GetCurrentProcess().Modules,我可以看到我正在查找的DLL。开始时的断言是否失败?