Ошибка времени выполнения Azure от Swagger и CastleWindsor - PullRequest
0 голосов
/ 25 июня 2018

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

В проекте 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();
            });

Если мы отключим swagger (удалив атрибут сборки), приложение начнет сбой при запуске 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 в Куду показывает правильные версии для поддержки 4.7.1, как описано здесь: https://github.com/Azure/app-service-announcements/issues/63

Приложение, которое не запущено, развертывается в виртуальном каталоге (/ api) службы приложений в Azure. Основной веб-сайт (on /) является статическим и использует угловой доступ к 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, скорее, это связано с версией фреймворка или несоответствующей версией сборки, так как приложение работает на моем компьютере. Разработка машины без ошибок, но у меня закончились идеи, что попробовать дальше.

1 Ответ

0 голосов
/ 25 июня 2018

Я нашел эту проблему https://forums.asp.net/t/2137242.aspx в результате поиска ошибки Виндзора, 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 предоставлял независимо от версии в корзине папка (также 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>

...