InProcProxyFactory.CreateInstance вызывается из службы WCF
Я пытаюсь использовать библиотеку ServiceModelEx от IDesign. Когда я пытаюсь позвонить:
InProcFactory.CreateInstance ();
с помощью службы WCF (в основном вызывая службу WCF B из службы WCF A), я получаю следующую ошибку:
Не удалось найти динамическую сборку
Код, который терпит неудачу:
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, потому что это не веб-сайт или веб-приложение (это служба WCF). Однако код работает, если я звоню с веб-сайта, из веб-приложения или из EXE-файла. Это от deisgn?
2 ответа
Возможно, модули, которые вы ожидаете, просто не были загружены в этом сценарии.
Это общий распознаватель падает. Он пытается сделать все возможное, чтобы обнаружить все сборки, в которых могут быть контракты на данные, но это что-то вроде гонки вооружений, поскольку всплывают различные среды размещения (особенно варианты IIS). Введение динамического кода также усложнило жизнь.
Если вы используете последнюю версию ServiceModelEx (SME), она исправит это. Просто убедитесь, что вы используете последнюю версию.NET (в настоящее время 4.6.1) в загрузке, так как более старые версии.NET для SME (например, 4.0 и более ранние) не будут иметь этих исправлений. При необходимости вы можете понизить версию.NET (в определенных пределах). Например, я взял версию 4.6.1 до 4.5.2.
Примечание: это необходимо только в том случае, если вы используете наследование контракта данных через Generic Resolver. Если вам не нужна эта функция, и она вызывает у вас проблемы, вы можете просто закомментировать нарушающий код.