Базовый API-интерфейс ASP.NET в службе приложений Azure 404 - PullRequest
1 голос
/ 12 апреля 2019

У меня есть приложение ASP.NET Core 2.1, которое я разместил в службе приложений Azure. Когда выполняется локально, я могу получить доступ к контроллеру. Но когда я размещаю приложение Azure, я получаю 404. Вот минимальные шаги для воспроизведения.

В Visual Studio 2017 добавьте новый проект. Выберите Базовое веб-приложение ASP.NET. Выберите ASP.NET Core 2.1, шаблон проекта API, без аутентификации, настройте HTTPS. Запустите новое приложение как самостоятельное размещение (не используя IIS). Перейдите к https://localhost:5001/api/values. Я получил ожидаемый ответ (хотя в командной строке есть исключение из-за сбоя аутентификации HTTPS-соединения).

Щелкните правой кнопкой мыши проект и выберите «Опубликовать». Выберите, чтобы создать новую службу приложений. Я выбрал свою существующую подписку, план хостинга и группу ресурсов. Я оставил имя приложения по умолчанию. Создайте приложение.

Перейдите по ссылке https://app_name.azurewebsites.net, и я вижу страницу по умолчанию. Перейдите на https://app_name.azurewebsites.net/api/values, и я получу 404.

Я уверен, что упускаю что-то довольно глупое, но я просто не могу понять это.

1 Ответ

2 голосов
/ 15 апреля 2019

Мне удалось воспроизвести ошибку, и ниже решение сработало для меня.Попробуйте это, если вы не пробовали ранее.

  1. Перед публикацией приложения в Azure убедитесь, что для конфигурации задан режим выпуска.
  2. Добавьте атрибут [Route ("/")] поверх вашего метода GET в ValuesController, как показано ниже.

    [Route("/")]
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        return "value";
    }
    

По существу, любые методы контроллера, не имеющие атрибута маршрута, используют маршрутизацию на основе соглашений.

При использовании атрибута [Маршрут] вы определяете атрибутмаршрутизация и, следовательно, обычная маршрутизация не используется для этого действия / контроллера.

Как вариант, вы можете использовать тот факт, что атрибуты маршрутов могут сочетаться с наследованием.Установите атрибут Route на всем контроллере, и он будет работать как префикс маршрута (такое же поведение, как и у атрибута [RoutePrefix] в WebApi):

[Route("api/[controller]")]
public class ValuesController: ControllerBase
{

}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...