Search code examples
azureasp.net-corekestrel-http-server

Publish rc2 asp.net core application to Azure


I managed to publish my application from VSO to Windows Azure. The problem now is that my application fail to start on Azure with this error (it works perfectly locally) :

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].

I tried to add the dependency manually but it didn't solve the problem :

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

Here is my config

global.json:

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

project.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": { }
  }

Solution

  • Test Locally on IIS

    Azure uses IIS under the covers. If the app works in IIS, it will usually work in an Azure Web App. The official docs have clear instructions for publishing to IIS. Once it works in IIS, deploy the same stuff to Azure.

    RC2 Azure Publish Walk-thru

    Here are the exact publish steps that work for me. I made a sample that uses the project.json from your question and pushed the sample to GitHub.

    Clone the sample:

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

    Then publish the project:

    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
    

    Those commands target the RC2 runtime, restore the NuGet packages, and publish a release configuration to the approot directory. This is the result:

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

    Now, using FTP, publish the approot and wwwroot directories to Azure's site directory.

    ./site
        approot
        wwwroot
    

    This is the result in Azure.

    Use of the System.Runtime.InteropServices in Azure

    A Final Note

    Be careful "crossing the streams." Your app has two release versions in its project.json/global.json files: 1.0.0-rc2-20221 and 1.0.0-rc2-20270. It is probably better to choose one.