我无法向在Azure应用服务上运行的64位ASP.NET Core API发出请求。我得到的错误是:
未处理的异常:System.BadImageFormatException:无法加载文件或程序集' ***。dll'。试图加载格式不正确的程序。
据我所知,这意味着应用程序平台(64位)与运行环境之间存在不匹配。我只是无法弄清楚如何更改App Service,以便它使用64位运行。
在Azure门户的“应用程序设置”中,我将Platform设置为64位:
但是当我检查Kudu时,运行时环境表明它在win8-x86下运行:
project.json
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true,
"platform": "x64"
},
"runtimes": {
"win10-x64": {}
}
一些问题
win8...
中的运行时配置指定project.json
时,RID是win10...
是否重要?据推测x86 vs x64很重要,但是它也需要是相同版本的windows,即。 win8 vs win10。答案 0 :(得分:11)
TLDR; Azure上尚不支持使用.NET核心运行时(而不是.NET Framework运行时)的64位.NET核心进程,但计划将来推出。
以下内容来自我对Microsoft Azure支持的讨论。
Azure门户上的64位/ 32位配置(在我的屏幕截图中显示)控制IIS w3wp.exe进程。 w3wp.exe进程将请求转发给您的NET核心进程。配置不控制.NET核心进程的位数。这有点令人困惑,但解释了为什么在上面的screneshot中更改Platform选项没有任何影响。
根据app服务的PATH环境变量设置,dotnet.exe映射到32位,即“D:\ Program Files(x86)\ dotnet \ dotnet.exe”。 .NET核心的64位运行时未预先安装在应用服务中,因此目前无法使用。
Microsoft计划为Azure中.NET核心运行时上运行的.NET核心应用程序添加64位支持,但这取决于.NET核心工具链的未来更新。他们给了我一个估计的内部日期,但我承诺我不会公开分享。
他们给我的解决方法是使用ASP.NET核心(使用.net框架)可视工作室模板,而不是ASP.NET核心(使用.net核心)。那个为您的ASP.Net核心Web应用程序加载64位.Net框架运行时。这将需要一些迁移工作,我认为某些项目可能无法实现。
幸运的是,我能够交换到某些依赖项的32位版本,这意味着该应用程序在Azure环境中运行。遗憾的是,这对那些没有这个选项的人来说意义不大,我相信有很多选择。
答案 1 :(得分:9)
如果您需要64位运行时,有4种方法可以执行此操作:
在以下链接中查看有关如何操作的详细信息: https://blogs.msdn.microsoft.com/webdev/2018/01/09/64-bit-asp-net-core-on-azure-app-service/
致记者:Glenn Condron
答案 2 :(得分:1)
现在可以在Azure App Service中使用它。
部署步骤:
<PropertyGroup>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
dotnet publish
,只需添加-r win-x64
)文档为here,但是(目前)它被认为是稀疏的。
此github issue response建议我们应该能够进行依赖于框架的部署,并使它“正常工作”。 YMMV,但这不是我自己的经验,因此上面的运行时标志建议
答案 3 :(得分:0)
dotnet publish命令生成一个web.config文件,IIS使用该文件来启动dotnet进程。在Kudu中,在PATH环境中,变量dotnet.exe来自 D:\ Program Files(x86)\ dotnet
解决方案是在构建后替换此文件
<aspNetCore processPath="dotnet" arguments=...
具有:
<aspNetCore processPath="%ProgramFiles%\dotnet\dotnet" arguments=...