我一直在向在Azure应用服务上运行的64位ASP.NET Core API发出请求时遇到麻烦。我得到的错误是:
未处理异常:System. BadImageFormatException:未能加载文件或程序集“***. dll”。试图加载格式不正确的程序。
我理解这意味着应用程序的平台(64位)和它运行的环境之间存在不匹配。我只是不知道如何更改应用程序服务,使其使用64位运行。
在Azure门户的应用程序设置中,我已将平台设置为64位:
然而,当我签入Kudu时,运行时环境表明它在win8-x86下运行:
- project. json**
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true,
"platform": "x64"
},
"runtimes": {
"win10-x64": {}
}
- 有些问题**
1.如何更改App Service以确保其在64位平台上运行?
1.当我在project.json
中的运行时配置指定win10...
时,RID是win8...
是否重要?大概x86 vs x64很重要,但它是否需要是相同版本的windows太ie. win8 vs win10.
5条答案
按热度按时间46scxncf1#
现在,Azure App Service中提供了这一功能。
部署步骤:
1.在门户中将平台设置为64位
1.通过在CSProj中包括以下内容,确保项目目标为64位:
1.发布应用程序时,确保目标框架设置为win-x64。(如果运行
dotnet publish
,只需添加-r win-x64
)文档是here,但(目前)它被认为有点稀疏。
这个github问题回应建议我们应该能够做一个依赖于框架的部署,并让它“正常工作”。YMMV,但这不是我自己的经验,因此上面的运行时标志建议
1mrurvl12#
**TLDR;**使用.NET核心运行时(相对于.NET Framework运行时)的64位.NET核心进程在Azure上尚不受支持,但计划在未来推出。
以下是我与Microsoft Azure支持的讨论。
Azure门户上的64位/32位配置(如上面我的屏幕截图所示)控制IIS w3wp.exe进程。w3wp.exe进程将请求转发到NET核心进程。配置不控制.NET核心进程的位数。这有点令人困惑,但解释了为什么在上面的screneshot中更改平台选项没有影响。
根据app service的PATH环境变量设置,dotnet.exe被Map到32位的,即“D:\Program Files(x86)\dotnet\dotnet.exe”。.NET核心的64位运行时未预安装在应用程序服务中,因此目前不可用。
微软计划在Azure中的.NET核心运行时上运行的.NET核心应用程序中添加64位支持,但这取决于.NET核心工具链的未来更新。他们给了我一个估计的内部日期,但我保证我不会公开分享。
他们给我的一个变通方法是使用ASP.NETcore(使用. netframework)Visual Studio模板,而不是ASP.NETcore(使用. netcore)模板。该应用程序为ASP.NET核心Web应用程序加载64位.Net框架运行时。这将需要一点迁移工作,我认为可能不可能为一些项目。
幸运的是,我能够交换到我的一些依赖项的32位版本,这意味着应用程序可以在Azure环境中工作。可悲的是,这对那些没有这个选择的人来说意义不大,我相信有很多人。
laawzig23#
如果您需要64位运行时,有4种方法可以做到这一点:
1.部署自包含的应用程序
1.部署自己的运行时
1.使用Linux Azure应用服务
1.将Web应用程序用于容器
有关如何做到这一点的更多详细信息,请参阅下面的链接:https://blogs.msdn.microsoft.com/webdev/2018/01/09/64-bit-asp-net-core-on-azure-app-service/
导演:Glenn Condron
wswtfjt74#
dotnetpublish命令生成一个web.config文件,IIS使用该文件启动dotnet进程。在Kudu中,PATH环境变量dotnet.exe来自 D:\Program Files(x86)\dotnet
解决方案是在生成后在此文件中替换
其中:
2admgd595#
在64位中运行的AppService有4个要求
1.在Azure Portal中将AppService设置为64位(这使得Webserver-Process以64位运行)
1.确保您的应用程序能够在64位平台上运行(例如通过在项目文件
<PropertyGroup> <PlatformTarget>x64</PlatformTarget> </PropertyGroup>
中将平台设置为x64)1.。。这是我花了最长时间才弄明白的一个:转到Azure门户中AppService的扩展刀片,并为您的.NET版本安装x64扩展。所以对我来说,在这个时候,我安装了“ASP.NET Core 7. 0(x64)Runtime”
1.您的AppService需要在至少为Basic层(当然也可以更高)的AppServicePlan上运行
为了检查是否成功,您可能希望将
Environment.Is64BitProcess
的结果包含在日志或类似的东西中,看看您是否真的在64位上运行。