Как изменить службу приложений 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.
Шаги для развертывания:
- Установить платформу на 64-битную в портале
- Убедитесь, что проект нацелен на 64-разрядную версию, включив в csproj следующее:
<PropertyGroup>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
- При публикации приложения убедитесь, что целевая платформа установлена на 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 способа сделать это:
- Развертывание автономного приложения
- Разверните свою собственную среду выполнения
- Использовать службу приложений Linux Azure
- Используйте веб-приложения для контейнеров
Подробнее о том, как это сделать, см. По ссылке ниже: 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=...