У меня проблема с развернутым приложением. Я постараюсь предоставить как можно больше информации.
В проекте api используются как Swagger через Swashbuckle, так и Castle Windsor.
Когда Swagger включен в SwaggerConfig.cs через
[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]
, мы получаем следующее исключение:
Method not found: 'Void Swashbuckle.Application.SwaggerDocsConfig.RootUrl(System.Func`2<System.Net.Http.HttpRequestMessage,System.String>)'.
Вот полный вызов регистрации, на случай, если он уместен
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.RootUrl(req => req.RequestUri.GetLeftPart(UriPartial.Authority) + "/api");
c.MultipleApiVersions((api, v) => true,
vc =>
{
vc.Version("mobile", "Mobile");
vc.Version("web", "Web");
});
c.UseFullTypeNameInSchemaIds();
c.DescribeAllEnumsAsStrings();
c.DocumentFilter<VersionFilter>();
})
.EnableSwaggerUi(c =>
{
c.EnableDiscoveryUrlSelector();
});
Если мы отключим чванство (удалив атрибут сборки), приложение затем начнет давать сбой при запуске Castle Windsor со следующей ошибкой:
Method 'Create' in Type 'XXX.XXX.XXX.CastleWindsor.WindsorCompositionRoot' from assembly 'xxx.xxx.Backend, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.'
Вот метод Configure () для WindsorConfig.cs
public static void Configure()
{
WindsorConfig.Container = new WindsorContainer();
WindsorConfig.Container.Install(FromAssembly.This());
System.Web.Http.GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorCompositionRoot(WindsorConfig.Container));
}
Проблема возникла, когда мы обновили общую библиотеку в решении до .net standard 2 с PCL. Это, в свою очередь, означало, что нам пришлось обновить все другие проекты в решении до .net 4.7.1 (в решении есть приложение UWP, которое было нашей исходной целью обновления, что означало, что нам пришлось обновить библиотеку, но я отвлекся) Итак, подведем итог: эта проблема возникла при обновлении до 4.7.1.
Приложение развертывается в Azure через Bamboo с помощью msbuild и msdeploy. Мы уверены, что двоичные файлы и web.config синхронизированы с разработкой, поскольку для уверенности мы вручную развернули их через FTP. Я удалил все двоичные файлы через FTP перед повторной загрузкой, чтобы убедиться, что нет устаревших сборок.
Я убедился, что приложение Azure в Kudu показывает правильные версии для поддержки 4.7.1, как описано здесь: https://github.com/Azure/app-service-announcements/issues/63
Не запущенное приложение развертывается в виртуальном каталоге (/ api) службы приложений в Azure. Основной веб-сайт (на /) является статическим и использует angular для доступа к API.
Я подтвердил, что файл web.config в проектах / и / api показывает
<compilation targetFramework="4.7.1" />
<httpRuntime targetFramework="4.7.1" />
Ниже приведены версии пакетов (мы выполнили переустановку nuget после обновления целевой платформы):
<package id="Castle.Core" version="3.3.0" targetFramework="net471" />
<package id="Castle.Windsor" version="3.3.0" targetFramework="net471" />
<package id="Castle.Windsor.Lifestyles" version="0.4.0" targetFramework="net471" />
<package id="Swashbuckle" version="5.3.2" targetFramework="net471" />
<package id="Swashbuckle.Core" version="5.3.2" targetFramework="net471" />
Раньше у меня была эта проблема в среде разработки, когда я пытался перейти на 4.7.1 (для другой зависимости), но на этот раз разработка работает без ошибок, и только теперь она дает сбой при развертывании в Azure. Версия .NET Framework на портале Azure для этой службы приложений показывает 4.7.
Прямо сейчас я думаю, что проблема на самом деле не в коде, который мы используем для инициализации Swagger и / или Castle Windsor, это, скорее всего, связано с версией фреймворка или несовпадающей версией сборки, поскольку приложение работает на моей машине разработки без ошибка, но у меня закончились идеи, что попробовать дальше.