将 rc2 asp.net 核心应用程序发布到 Azure
Publish rc2 asp.net core application to 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"
这是我的配置
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": { }
}
在 IIS 上进行本地测试
Azure 在幕后使用 IIS。如果应用程序在 IIS 中运行,它通常会在 Azure Web 应用程序中运行。官方文档有clear instructions for publishing to IIS。一旦它在 IIS 中工作,将相同的东西部署到 Azure。
RC2 Azure 发布演练
以下是适合我的确切发布步骤。我制作了一个示例,其中使用了您问题中的 project.json 和 pushed the sample to GitHub.
克隆示例:
C:\> git clone https://github.com/bigfont/Whosebug.git
C:\> cd .\Whosebug\RuntimeInfo
然后发布项目:
C:\Whosebug\RuntimeInfo> dnvm use 1.0.0-rc2-20221 -runtime clr
C:\Whosebug\RuntimeInfo> dotnet restore
C:\Whosebug\RuntimeInfo> dotnet publish -c Release -o ./approot
这些命令以 RC2 运行时为目标,恢复 NuGet 包,并将发布配置发布到 approot 目录。这是结果:
C:\Whosebug\RuntimeInfo> dir
approot
bin
obj
Program.cs
project.json
project.lock.json
wwwroot
现在,使用 FTP,将 approot
和 wwwroot
目录发布到 Azure 的 site
目录。
./site
approot
wwwroot
这是 Azure 中的结果。
最后的说明
小心"crossing the streams."您的应用在其项目中有两个发布版本。json/global.json 文件:1.0.0-rc2-20221 和 1.0.0-rc2-20270 .大概选一个比较好。
我设法将我的应用程序从 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"
这是我的配置
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": { }
}
在 IIS 上进行本地测试
Azure 在幕后使用 IIS。如果应用程序在 IIS 中运行,它通常会在 Azure Web 应用程序中运行。官方文档有clear instructions for publishing to IIS。一旦它在 IIS 中工作,将相同的东西部署到 Azure。
RC2 Azure 发布演练
以下是适合我的确切发布步骤。我制作了一个示例,其中使用了您问题中的 project.json 和 pushed the sample to GitHub.
克隆示例:
C:\> git clone https://github.com/bigfont/Whosebug.git
C:\> cd .\Whosebug\RuntimeInfo
然后发布项目:
C:\Whosebug\RuntimeInfo> dnvm use 1.0.0-rc2-20221 -runtime clr
C:\Whosebug\RuntimeInfo> dotnet restore
C:\Whosebug\RuntimeInfo> dotnet publish -c Release -o ./approot
这些命令以 RC2 运行时为目标,恢复 NuGet 包,并将发布配置发布到 approot 目录。这是结果:
C:\Whosebug\RuntimeInfo> dir
approot
bin
obj
Program.cs
project.json
project.lock.json
wwwroot
现在,使用 FTP,将 approot
和 wwwroot
目录发布到 Azure 的 site
目录。
./site
approot
wwwroot
这是 Azure 中的结果。
最后的说明
小心"crossing the streams."您的应用在其项目中有两个发布版本。json/global.json 文件:1.0.0-rc2-20221 和 1.0.0-rc2-20270 .大概选一个比较好。