Я пытаюсь запустить портативную сборку приложения ASP.NET в .net 8 на Raspberry Pi. У меня есть Raspberry Pi 4 с последней облегченной версией Raspberry Pi OS (Bookworm). Мои настройки публикации для приложения:
Delete existing files : false
Configuration : Release
Target Framework : net8.0
Target runtime : Portable
Приложение запускается и выводит это на Pi:
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /home/pi/dotnet/lora_api
ApplicationSettings.json:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:21262",
"sslPort": 0
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5020",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Однако я не получаю ответа от localhost:5000/(RaspiLocalAddress):5000. Я что-то упускаю?
Похоже, он слушает только с локального хоста? Попробуйте запустить сервер с переменной:
ASPNETCORE_URLS=http://+:5000
Добавить это в файл launchsettings.json?
Я пробовал это как параметр запуска. Однако я до сих пор не получаю ответа от сервера. Я обновлю исходное сообщение, включив в него файл настроек запуска моего проекта.
Вероятно, адрес правильный, поскольку теперь я получаю исключение доступа к файлу на PI, когда пытаюсь подключиться к маршруту, который обращается к локальным файлам, если только я не запускаю приложение как sudo. И если я запускаю от имени sudo и подключаюсь к указанному маршруту, я больше не получаю исключения, но приложение возвращает код HTTP 500.
В настройках запуска есть настройки для разработки, а не производства. Вам нужно определить это в другом месте. например переменная env, как я предложил. MS Docs Указывает, где сервер должен прослушивать запросы. Запрос получит доступ к вашему PI, даже если эти настройки неправильны, только сервер не будет его слушать. Он будет прослушивать только запросы, отправленные на « localhost:5000». Это не тот адрес, который вы используете при подключении из-за пределов PI.
Это сделало это. В примерах по умолчанию пакеты API и UI по какой-то причине находятся в условии if. Мне не нужен пользовательский интерфейс, поэтому я оставил его там, но поместил пакет API вне условия if в сборщике.
@Pejda отметил в своем комментарии, что Environment.IsDevelopment()
устанавливается при каждом запуске на сервере разработки Visual Studio или IIS. Пример ASP.NET по умолчанию для API HTTP-запросов, по-видимому, переместил как конвейер HTTP-запросов, так и пользовательский интерфейс разработки в проверку if-statement, установлен ли Environment.IsDevelopment()
во время сборки приложения.
Решение состоит в том, чтобы переместить службу конвейера HTTP-запросов за пределы указанного оператора if. В моем случае требовался только сервис запросов, а не прилагаемый пользовательский интерфейс отладки, поэтому я оставил пользовательский интерфейс внутри условия:
app.UseSwagger(); //Move this here
if (app.Environment.IsDevelopment())
{
//app.UseSwagger was previously here
app.UseSwaggerUI();
}
Просто чтобы уточнить: я настроил порт 5000 в UFW. Я не вижу открытых TCP-портов при сканировании локального адреса Pi с помощью nmap, за исключением ssh-соединения, которое я использую для доступа к Pi.