Как направить действия контроллера на основе значения определенного параметра строки запроса? - PullRequest
0 голосов
/ 23 сентября 2019

Я собираюсь переписать устаревший веб-API PHP в ASP MVC.Вызовы устаревшего API отличаются первым параметром строки запроса под названием «функция» с переменным количеством дополнительных параметров, основанных на параметре функции.

contoso.com/api.php?function=func1&param1=x&param2=y&...

Теперь я хотел бы направить эти вызовы на основеэтот параметр для различных действий контроллера вместо одного действия, условно проверяющего значение параметра 'function'.

Каков наилучший способ достичь этого?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Вы можете сделать пользовательский селектор контроллера.Основная идея заключается в том, что вы, прежде всего, создаете обработчик, который будет направлять ваш запрос на ваш контроллер на основе вашей собственной логики (например, ваша логика может быть - если запрос имеет параметр параметров func1, то вы должны направить свой запрос на контроллер func1.)

Вы делаете обработчик:

public class RouteSpecificHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Properties["UseCustomSelector"] = true;
        return base.SendAsync(request, cancellationToken);
    }
}

Вы делаете селектор контроллера:

public class CustomSelector : DefaultHttpControllerSelector
{
    public CustomSelector(HttpConfiguration configuration) : base(configuration)
    {
    }

    public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
    {
        if (request.Properties.ContainsKey("UseCustomSelector") &&
            request.Properties["UseCustomSelector"] as bool? == true)
        {
            //your logic goes here
        }

        return base.SelectController(request);
    }
}



config.Routes.MapHttpRoute(
            name: "MyRoute",
            routeTemplate: "api/dummy/{id}",
            defaults: new {controller = "Dummy", id = RouteParameter.Optional},
            constraints: null,
            handler: new RouteSpecificHandler { InnerHandler = new HttpControllerDispatcher(config) }
            );

Вы можете увидеть больше здесь: Пользовательский IHttpControllerSelector веб-API ASP.NET дляодиночный маршрут

0 голосов
/ 23 сентября 2019
public async Task<IActionResult>api(string func1,string param1,string param2)
{
    //.....
}

Пожалуйста, попробуйте это.

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