如何将Azure App Service更改为64位

时间:2017-03-10 19:32:15

标签: azure 64-bit .net-core

我无法向在Azure应用服务上运行的64位ASP.NET Core API发出请求。我得到的错误是:

  

未处理的异常:System.BadImageFormatException:无法加载文件或程序集' ***。dll'。试图加载格式不正确的程序。

据我所知,这意味着应用程序平台(64位)与运行环境之间存在不匹配。我只是无法弄清楚如何更改App Service,以便它使用64位运行。

在Azure门户的“应用程序设置”中,我将Platform设置为64位:

enter image description here

但是当我检查Kudu时,运行时环境表明它在win8-x86下运行:

enter image description here

project.json

"buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "platform": "x64"
},

"runtimes": {
    "win10-x64": {}
}

一些问题

  1. 如何更改App Service以确保它在64位平台上运行?
  2. win8...中的运行时配置指定project.json时,RID是win10...是否重要?据推测x86 vs x64很重要,但是它也需要是相同版本的windows,即。 win8 vs win10。

4 个答案:

答案 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种方法可以执行此操作:

  1. 部署自包含的应用程序
  2. 部署您自己的运行时
  3. 使用Linux Azure App服务
  4. 使用Web Apps for Containers
  5. 在以下链接中查看有关如何操作的详细信息: 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中使用它。

部署步骤:

  1. 在门户中将平台设置为64位
  2. 通过在csproj中包含以下内容,确保项目目标为64位:
<PropertyGroup>
  <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
  1. 发布应用程序时,请确保将目标框架设置为win-x64。 (如果运行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=...