"System.MissingMemberException: сервер factory не может быть расположен", запуск Microsoft.Owin самостоятельно в TeamCity
Когда Teamcity запускает интеграционный тест, который запускает самообслуживаемое web-приложение, тест не выполняется с ошибкой:
System.MissingMemberException: The server factory could not be located for the given input: Microsoft.Owin.Host.HttpListener
Код, вызывающий эту ошибку:
var webApp = WebApp.Start<Startup>("http://*:52203/")
Тест выполняется нормально, когда выполняется с помощью Visual Studio (с помощью тестового бегуна Resharper). Teamcity настроен на использование исполняемого файла JetBrains.BuildServer.NUnitLauncher.exe
для запуска теста.
Я вижу, что много сообщений об этой ошибке связано с тем, что Microsoft.Owin.Host.HttpListener.dll
отсутствует в папке bin\debug или bin\release. Я могу подтвердить, что этот файл (и сопровождающий .xml файл) присутствуют в папке bin\release, используемой TeamCity buildAgent. Нет папки bin\debug.
Ответы
Ответ 1
Я столкнулся с этим в своей Powershell script, которая выполняет итерации всех наших решений и строит их с помощью MSBuild, а затем вызывает MSTest во всех тестовых проектах. Этот script используется для сборки и тестирования всех решений локально, прежде чем переходить к TFS. Эта проблема не возникает при запуске тестов в VS. Я считаю, что это связано с этим вопросом.
Поместите следующее непосредственно перед вызовом WebApp.Start( "http://*: 52203/" ) в инициализации теста.
// This uber silly code is needed to ensure the Owin HttpListener assembly
// is properly copied to the output directory by using it, utterly redonkulous.
var uberSillyNecessity = typeof(OwinHttpListener);
if (uberSillyNecessity != null) { }
Ответ 2
У меня была такая же проблема:
Работает нормально локально, но не работает агент TeamCity.
В моем тестовом проекте была ссылка через nuget на Microsoft.Owin.Host.HttpListener
Для меня работала явная загрузка DLL Microsoft.Owin.Host.HttpListener перед запуском веб-приложения.
// load assembly
AppDomain.CurrentDomain.Load(typeof(Microsoft.Owin.Host.HttpListener.OwinHttpListener).Assembly.GetName());