Ошибка выполнения Azure от Swagger и CastleWindsor

У меня проблема с развернутым приложением. Я постараюсь предоставить как можно больше информации.

В проекте 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, это, скорее всего, связано с версией фреймворка или несовпадающей версией сборки, поскольку приложение работает на моей машине разработки без ошибка, но у меня закончились идеи, что попробовать дальше.


person agrath    schedule 24.06.2018    source источник


Ответы (1)


Я обнаружил эту проблему https://forums.asp.net/t/2137242.aspx путем поиска ошибки Windsor, System.Web.Http.Dispatcher.IHttpControllerActivator не удалось создать экземпляр с ошибкой Method 'Create' in type 'MyType' from assembly 'MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

Это привело меня к проверке System.Net.Http развернутых версий. System.Net.Http был 4.2.0.0 локально, и эта DLL была развернута в Azure, но похоже, что среда выполнения действительно использовала другую версию.

Что странно, когда я удалил развернутую версию System.Net.Http из папки bin, в сообщении об ошибке говорилось: 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, так что это версия сборки, которую предоставляла Azure, независимо от версии в папке bin (также 4.2. 0,0).

Я добавил перенаправление привязки для System.Net.Http, и теперь приложение запускается нормально

<dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/> <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0"/> </dependentAssembly>

person agrath    schedule 24.06.2018