从WCF服务调用的InProcProxyFactory.CreateInstance

时间:2012-10-30 19:26:42

标签: wcf proxy proxyfactory servicemodelex

我正在尝试使用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吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

那是通用的解析器摔倒了。它试图最好发现可能在其中包含数据合同的所有程序集,但它是一种军备竞赛,因为不同的托管环境(特别是IIS变体)弹出窗口。动态代码的引入也使生活变得更加困难。

如果您使用最新的ServiceModelEx(SME),则可以修复此问题。只需确保在下载中使用最新的.NET版本(目前为4.6.1),因为较旧的.NET版本下载的SME(例如4.0及更早版本)将不具备这些修复程序。如果需要,您可以降级.NET版本(在限制范围内)。例如。我将4.6.1版本降为4.5.2。

注意:只有在通过Generic Resolver使用数据合同继承时才需要这样做。如果您不需要此功能并且它会导致您出现问题,则可以注释掉有问题的代码。