Публикация основного приложения asp.net версии rc2 в Azure.

Мне удалось опубликовать свое приложение из VSO в Windows Azure. Теперь проблема в том, что мое приложение не запускается в Azure с этой ошибкой (локально оно отлично работает):

System.TypeInitializationException: The type initializer for 'Microsoft.AspNetCore.Server.Kestrel.Networking.PlatformApis' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
   at Microsoft.AspNetCore.Server.Kestrel.Networking.PlatformApis..cctor()
   --- End of inner exception stack trace ---
   at Microsoft.AspNetCore.Server.Kestrel.Networking.PlatformApis.get_IsWindows()
   at Microsoft.AspNetCore.Server.Kestrel.Networking.Libuv..ctor()
   at Microsoft.AspNetCore.Server.Kestrel.KestrelServer.Start[TContext](IHttpApplication`1 application)
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Start()
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host, CancellationToken token, String shutdownMessage)
   at Microsoft.AspNetCore.Hosting.WebHostExtensions.Run(IWebHost host)
   at MyApp.Web.Startup.Main(String[] args)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.Dnx.Runtime.Common.EntryPointExecutor.Execute(Assembly assembly, String[] args, IServiceProvider serviceProvider)
   at Microsoft.Dnx.ApplicationHost.Program.<>c__DisplayClass3_0.<ExecuteMain>b__0()
   at System.Threading.Tasks.Task`1.InnerInvoke()
   at System.Threading.Tasks.Task.Execute()
System.IO.FileNotFoundException: Could not load file or assembly 'System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.
File name: 'System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
   at Microsoft.AspNetCore.Server.Kestrel.Networking.PlatformApis..cctor()

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].

Я попытался добавить зависимость вручную, но это не решило проблему:

"System.Runtime.InteropServices.RuntimeInformation": "4.0.0-rc2-23826"

Вот моя конфигурация

глобальный.json:

{
  "projects": [ "src", "test", "lib" ],
  "sdk": {
    "version": "1.0.0-rc2-20221",
    "runtime": "clr",
    "architecture": "x86"
  }
}

проект.json

  "compilationOptions": {
    "emitEntryPoint": true
  },
  "dependencies": {
    "Jil": "2.13.0",
    "JWT": "1.3.4",
    "Microsoft.AspNetCore.Authentication": "1.0.0-rc2-20270",
    "Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-20270",
    "Microsoft.AspNetCore.Hosting": "1.0.0-rc2-20270",
    "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-rc2-20270",
    "Microsoft.AspNetCore.IISPlatformHandler": "1.0.0-rc2-20270",
    "Microsoft.AspNetCore.Mvc.Core": "1.0.0-rc2-20270",
    "Microsoft.AspNetCore.Mvc.ViewFeatures": "1.0.0-rc2-20270",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-20270",
    "Microsoft.AspNetCore.StaticFiles": "1.0.0-rc2-20270",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-20270",
    "Microsoft.Extensions.DependencyInjection": "1.0.0-rc2-20270",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc2-20270",
    "Microsoft.Extensions.PlatformAbstractions.Dnx": "1.0.0-rc2-20221",
    "System.Runtime.InteropServices.RuntimeInformation": "4.0.0-rc2-23826"
  },
  "frameworks": {
    "net46": { }
  }

person yeska    schedule 20.03.2016    source источник
comment
Какие шаги вы использовали для публикации? Вы использовали FTP?   -  person Shaun Luttin    schedule 21.03.2016
comment
Да, я опубликовал с помощью FTP, я изменил web.cmd, чтобы он указывал непосредственно на папку времени выполнения (которую я копирую вручную в артефакт, потому что я не использую параметр --runtime active, если я использую этот параметр, публикация dnu завершается ошибкой)   -  person yeska    schedule 21.03.2016
comment
Вы пробовали хостинг локально с IIS? Я спрашиваю, потому что Azure использует IIS скрыто, и если мы заставим его работать локально с IIS, то мы сможем опубликовать тот же материал в Azure и быть совершенно уверенными, что он будет работать.   -  person Shaun Luttin    schedule 21.03.2016
comment
с помощью IisExpress это работает, я не пробовал IIS.   -  person yeska    schedule 21.03.2016
comment
Хорошо, я попробую IIS, но я думаю, что даже если он заработает, он не скажет нам, что не так с лазурью, я попробую и скажу вам.   -  person yeska    schedule 21.03.2016
comment
Azure использует IIS за кулисами. Итак, если это работает в IIS, то, скорее всего, будет работать и в Azure. Локальное тестирование публикации в IIS — это хорошая лакмусовая бумажка для определения того, будет ли она работать в Azure, поскольку локальное тестирование занимает гораздо меньше времени, чем публикация приложения размером примерно 50 МБ в Azure.   -  person Shaun Luttin    schedule 21.03.2016
comment
В IIS это, кажется, работает (это выходит за рамки запуска, поэтому не возникает той же проблемы). Проще тестировать на IIS, я сделаю еще несколько проверок завтра (сейчас в Париже 1:36), большое спасибо за вашу помощь,   -  person yeska    schedule 21.03.2016
comment
Попробуйте изменить .Net Framework на 4.5 и повторно развернуть его.   -  person Dev    schedule 21.03.2016


Ответы (1)


Локальное тестирование на IIS

Azure использует IIS скрыто. Если приложение работает в IIS, оно обычно работает и в веб-приложении Azure. В официальных документах есть четкие инструкции по публикации в IIS. Как только он заработает в IIS, разверните тот же материал в Azure.

Пошаговое руководство по публикации RC2 Azure

Вот точные шаги публикации, которые работают для меня. Я сделал образец, в котором используется файл project.json из вашего вопроса, и отправил образец на GitHub< /а>.

Клонируйте образец:

C:\> git clone https://github.com/bigfont/StackOverflow.git
C:\> cd .\StackOverflow\RuntimeInfo

Затем опубликуйте проект:

C:\StackOverflow\RuntimeInfo> dnvm use 1.0.0-rc2-20221 -runtime clr
C:\StackOverflow\RuntimeInfo> dotnet restore
C:\StackOverflow\RuntimeInfo> dotnet publish -c Release -o ./approot

Эти команды предназначены для среды выполнения RC2, восстанавливают пакеты NuGet и публикуют конфигурацию выпуска в каталоге approot. Вот результат:

C:\StackOverflow\RuntimeInfo> dir
approot            
bin                
obj                            
Program.cs         
project.json       
project.lock.json     
wwwroot

Теперь, используя FTP, опубликуйте каталоги approot и wwwroot в каталоге Azure site.

./site
    approot
    wwwroot

Это результат в Azure.

Использование System.Runtime.InteropServices в Azure

Последнее примечание

Будьте осторожны, «переходя через ручьи». У вашего приложения есть две версии выпуска в файлах project.json/global.json: 1.0.0-rc2-20221 и 1.0.0-rc2-20270. Вероятно, лучше выбрать один.

person Shaun Luttin    schedule 21.03.2016
comment
Локальный тест на IIS был очень полезен, я приму этот ответ, потому что это очень интересно, моя проблема заключалась в том, что, когда я вручную изменил web.cmd, я исправил версию своего пакета приложения, поэтому, когда я публиковал новые версии, это было всегда использую старую версию, в которой есть проблема. Большое спасибо за Вашу помощь - person yeska; 21.03.2016
comment
@yeska Ага. Да. Это было бы проблемой. Хорошо сделано, чтобы найти исправление, и спасибо, что приняли ответ. Не могли бы вы также проголосовать за это. Я был бы признателен, что. :) - person Shaun Luttin; 21.03.2016