Как изменить службу приложений Azure на 64-разрядную

У меня возникли проблемы с отправкой запроса на мой 64-разрядный API-интерфейс ASP.NET, работающий в Azure App Service. Ошибка, которую я возвращаю:

Необработанное исключение: System.BadImageFormatException: Не удалось загрузить файл или сборку "***. dll". Была сделана попытка загрузить программу с неправильным форматом.

Я понимаю, что это означает, что существует несовпадение между платформой приложения (64-разрядной) и той средой, в которой он работает. Я просто не могу понять, как изменить службу приложений, поэтому он работает с 64-разрядной версией.

В настройках приложения на портале Azure я установил платформу в 64-разрядную:

введите описание изображения здесь

Однако, когда я проверяю Kudu, среда выполнения указывает, что она работает под win8-x86:

введите описание изображения здесь

project.json

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

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

Некоторые вопросы

  • Как изменить службу приложений, чтобы обеспечить ее работу на 64-битной платформе?
  • Имеет ли значение, что RID win8..., когда моя конфигурация времени выполнения в project.json указывает win10.... Предположительно, x86 vs x64 имеет значение, но нужно ли быть одной и той же версией окон, т.е. win8 vs win10.

Ответ 1

Теперь это доступно в службе приложений Azure.

Шаги для развертывания:

  1. Установить платформу на 64-битную в портале
  2. Убедитесь, что проект нацелен на 64-разрядную версию, включив в csproj следующее:
<PropertyGroup>
  <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
  1. При публикации приложения убедитесь, что целевая платформа установлена на win-x64. (Если запущен dotnet publish, просто добавьте -r win-x64)

Документация здесь, но (в настоящее время) она немного скудна.

Этот ответ о проблеме github предполагает, что мы должны иметь возможность выполнять развертывание, зависящее от инфраструктуры, и сделать так, чтобы оно "просто работало". YMMV, но это был не мой собственный опыт, следовательно, предложенный выше флаг поддержки

Ответ 2

TL;DR; 64-разрядные основные процессы ядра .NET с использованием среды выполнения .NET(в отличие от среды выполнения .NET Framework) еще не поддерживаются Azure, но планируются в будущем.


Ниже приведены обсуждения, проведенные с поддержкой Microsoft Azure.

64-битная/32-битная конфигурация на портале Azure (показана выше на моем снимке экрана) управляет процессом IIS w3wp.exe. Процесс w3wp.exe отправляет запросы в ваш основной процесс NET. Конфигурация не контролирует битность основного процесса .NET. Это немного сбивает с толку, но объясняет, почему изменение параметра Platform в скриншоте выше не повлияло.

Основываясь на настройке переменной среды PATH для службы приложений, dotnet.exe сопоставляется с 32-разрядным, который представляет собой "D:\Program Files (x86)\dotnet\dotnet.exe". 64-битная среда выполнения ядра .NET не предварительно установлена ​​в приложениях, поэтому в настоящее время она недоступна.

Microsoft планирует добавить 64-разрядную поддержку основных приложений .NET, работающих в среде ядра .NET в Azure, но это зависит от будущего обновления основной инструментальной сети .NET. Они дали мне приблизительную внутреннюю дату, но я пообещал, что не буду публично публиковать ее.

Обходной путь, который они мне предоставили, заключался в использовании шаблона визуальной студии ASP.NET(с использованием .net framework), а не ядра ASP.NET(с использованием ядра .net). Он загружает 64-битную среду .NET Framework для вашего основного веб-приложения ASP.Net. Для этого потребуется небольшая работа по миграции, и я предполагаю, что некоторые проекты могут оказаться невозможными.

К счастью, мне удалось обменять на 32-битные версии некоторых из моих зависимостей, что означало, что приложение работало в среде Azure. К сожалению, это мало что значит для тех, у кого этого нет, и я уверен, что их много.

Ответ 3

Если вам нужна 64-битная среда выполнения, есть 4 способа сделать это:

  1. Развертывание автономного приложения
  2. Разверните свою собственную среду выполнения
  3. Использовать службу приложений Linux Azure
  4. Используйте веб-приложения для контейнеров

Подробнее о том, как это сделать, см. По ссылке ниже: https://blogs.msdn.microsoft.com/webdev/2018/01/09/64-bit-asp-net-core-on-azure-app-service./

Кредиты для: Гленн Кондрон

Ответ 4

Команда dotnet publish генерирует файл web.config, который используется IIS для запуска процесса dotnet. В Куду, в среде PATH переменная dotnet.exe находится в папке D:\Program Files (x86)\dotnet

Решение состоит в том, чтобы заменить в этом файле после сборки

<aspNetCore processPath="dotnet" arguments=...

с:

<aspNetCore processPath="%ProgramFiles%\dotnet\dotnet" arguments=...