"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());