MVC WebApi расширенная пользовательская маршрутизация - PullRequest
0 голосов
/ 20 июня 2019

Я борюсь с этим уже некоторое время.Я искал по всему интернету, не нашел никакого решения.

Я хотел бы создать проект webapi с несколько настраиваемой маршрутизацией.Используя VS 2019, проект имеет тип ASP.NET WebApi в .NET Core 2.2.Маршрутизация должна быть такой:

Базовое приложение должно находиться на URL-адресе, аналогичном "https://my.server.com/myapi". URL-адреса, которые будут вызываться, имеют форму" https://my.server.com/myapi/{InstanceName}/{CommandName}?{customParams}"

У меня определен один контроллерв моем проекте, и я хотел бы перенаправить все запросы к этому контроллеру, где instanceName может быть параметром всех методов, содержащихся в контроллере, поэтому я бы получил значение для этого параметра.CommandName в основном совпадает с «действием» RouteData по принципам MVC.Как вы можете видеть, контроллер не указан, так как все обрабатывается одним контроллером.

До сих пор я пытался настроить маршрутизацию следующим образом:

Startup.cs

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "MyRoute",
        template: "{instance}/{action}",
        defaults: new { controller = "MyController" });
    });
}

MyController.cs

[Route("/")]
[ApiController]
public class MyController : ControllerBase
{
    [HttpGet("{instance}/info")]
    public JsonResult Info(string instance, InfoCommand model)
    {
        // Just return serialized model for now.
        var result = new JsonResult(model);

        return result;
    }
}

Но это не работает.Я получаю 415 ответ от (я думаю) веб-сервера, когда я звоню, например,

https://my.server.com/myapi/MYINSTANCE/info?param1=value1&param2=value2

Во время отладки из VS этот URL выглядит следующим образом:

https://localhost:12345/MYINSTANCE/info?param1=value1&param2=value2

, но я думаю, что это не должно* не имеет значения для маршрутизации.

В лучшем случае (если поставить [Route("{instance}")] над контроллером и [HttpGet("info")] над инфо-методом), я получаю ответ 404, чего я тоже не хочу.

Я даже пытался создать свой собственный ControllerFactory, но это тоже не сработало (изменение контроллера в методе создания ControllerFactory и добавление другого параметра в RouteData).

Как настроить маршрутизацию таким образом?Это вообще возможно?Я все еще хотел бы использовать все другие функции MVC (привязка модели, правильная маршрутизация, функции аутентификации и т. Д.), Только эту маршрутизацию я не могу понять.

1 Ответ

2 голосов
/ 21 июня 2019

Ваша попытка, получившая 415 Unsupported Media Type error, была вашей лучшей.
Вы пропустили только FromQuery, как показано ниже.

Ошибка указывает, что сложный тип InfoCommand не может быть разрешен.
Вы должны указать, что он должен быть проанализирован из строки запроса.

Обратите внимание, что маршрут, определенный с помощью MapRoute, не имеет эффекта, так как вы используете маршрутизацию на основе атрибутов; это только один или другой.

[Route("/")]
[ApiController]
public class MyController : ControllerBase
{
    [HttpGet("{instance}/info")]
    public JsonResult Info(string instance, [FromQuery] InfoCommand model)
    {
        var result = new JsonResult(model);
        return result;
    }
}

public class InfoCommand
{
    public InfoCommand()
    {}

    public string Param1 { get; set; }
    public string Param2 { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...