Выделенный маршрут в. NET Ядро не распознано, производит 404 - PullRequest
0 голосов
/ 19 июня 2020

Я использую стратегию проверки работоспособности, которая возвращает certaing pong, когда я пингую по следующему URL-адресу.

localhost / util / ping

Это работает должен. Затем я подумал, что ленивый пользователь может пропустить ввод util или, возможно, запутаться, набрав util s , util ity или утилит ити . Это может расстраивать, особенно для новых разработчиков, которые не знают Swagger.

localhost / ping

Поэтому я решил ввести выделенный псевдо-маршрут, содержащий только ping , направленный на указанный выше URL. Насколько я могу судить, нет других маршрутов (кроме стандартного) или контроллеров с таким именем, которые могли бы конфликтовать.

app.UseEndpoints(endpoints =>
{
  endpoints.MapControllerRoute(
    name: "ping",
    pattern: "ping",
    defaults: new { controller = "util", action = "ping" });
  endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller}/{action=Index}/{id?}");
});

К сожалению, приведенный выше код не работает. Он выдает код состояния 404, и я не вижу, что мне не хватает, что может отличаться от примера в MSDN .

Контроллер объявлен следующим образом.

namespace Api.Controllers
{
  [ApiController]
  [Route("[controller]")]
  public class UtilController : ControllerBase
  {
    [HttpGet("ping")]
    public ActionResult Ping() { return Ok("pong"); }
  }
}

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Вы можете заменить его тильдой (~) для вашего конкретного метода. Таким образом, механизм маршрутизации отвечает также и для любого другого метода с общим маршрутом.

[Route("[controller]")]
[ApiController]
public class UtilController : ControllerBase {

    [HttpGet("~/[action]")]// http://localhost:5000/ping
    public ActionResult Ping() {
        return Ok("pong");
    }
    
    [HttpGet("[action]")]// http://localhost:5000/util/ping2 
    public ActionResult Ping2() {
        return Ok("pong2");
    }
}

результат теста почтальона

Еще более очевидным является использование обоих путей одним и тем же методом.

[ApiController, Route("[controller]")]
public class UtilController : ControllerBase {

  [HttpGet("ping"), HttpGet("/ping")]
  public ActionResult Ping3() {
    return Ok("pong");
  }

}
0 голосов
/ 19 июня 2020

Вы пробовали

app.UseEndpoints(endpoints =>
{
  endpoints.MapControllerRoute(
    name: "ping",
    pattern: "ping",
    defaults: new { controller = "util", action = "ping" });
  endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller=util}/{action=Index}/{id?}");
});

Исходя из того, что я вижу в примере на microsoft do c, который вы предоставили, шаблон для маршрута по умолчанию должен иметь {controller=/*something*/}, а не только {controller}. В моем собственном приложении у меня есть:

endpoints.MapControllerRoute(name: "Default",
                    pattern: "{controller=Home}/{action=/*myaction*/}/{id?}");

И мой контроллер - HomeController.cs Таким образом, мне не нужно иметь [Route("[controller]")] в начале моего класса контроллера. Однако, если вы хотите сохранить его, то, возможно, вам стоит попробовать:

endpoints.MapControllerRoute(name: "Default",
                    pattern: "controller/{action=/*myaction*/}/{id?}");

Надеюсь, это поможет в вашей ситуации!

...