Azure - веб-API и шаблон маршрута с регулярным выражением - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть приложение .NET Core с небольшим веб-API.

Следующий маршрут работает без проблем.

Рабочий HTTP-маршрут

[HttpGet("api/voting/{id:int}")]
[Produces("application/json")]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(Voting))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> GetByIdAsync([FromRoute] int id)
{
    // Left out for the sake of brevity ...
}

Не работающий HTTP-маршрут (только в Azure)

[HttpGet("api/voting/{slug:regex(\\w+)}/full")]
[MapToApiVersion("1.0")]
[Produces("application/json")]
[ProducesResponseType((int)HttpStatusCode.OK, Type = typeof(Voting))]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> GetBySlugAsync([FromRoute] string slug)
{
      // Left out for the sake of brevity ...
}

Сообщение об ошибке в Azure

enter image description here

Устранение неполадок

  • Все работает отлично, если я запускаю его в локальной среде, проблема появляется только после запуска в Azure.
  • В Requested URL добавлен порт 80, который я не совсем понимаю, так как я общаюсь только через https с сервисом. Может ли быть так, что регулярное выражение мешает суффиксу порта?
  • Physical Path по какой-то причине добавляет маршрут в каталог wwwroot. Означает ли это, что маршрут не может быть правильно определен?

    Заранее спасибо!

1 Ответ

0 голосов
/ 17 сентября 2018

404 ошибка может быть вызвана проблемой маршрута.Так как вы используете атрибут маршрута для вашего веб-API.Убедитесь, что GlobalConfiguration.Configure(WebApiConfig.Register); выше другого кода.

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

И config.MapHttpAttributeRoutes(); код выше конфигурации других маршрутов.

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
  name: "versionApi",
  routeTemplate: "api/{version}/{controller}/{id}",
  defaults: new { id = RouteParameter.Optional }
);

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

[Dependency]
public IConfigurationServicev2 configurationService { get; set; }

[Dependency]
public IAccountService accountService { get; set; }

Если он также не может работать для вас.Вы можете получить подробное сообщение об ошибке с веб-сервера после установки свойства IncludeErrorDetailPolicy в классе WebApiConfig.

config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
...