Как обойти все другие маршруты MVC, когда URL содержит определенный параметр запроса? - PullRequest
2 голосов
/ 03 мая 2019

Мне нужно захватить любой запрос, который содержит параметр запроса URLToken , например, в этом URL:

http://test.server.com/product?URLToken=4abc4567ed...

и перенаправить его на определенный контроллер и действие.

Я попытался настроить различные маршруты с ограничениями, включая тот, который показан ниже.

app.UseMvc(routes =>
{
    routes.MapRoute(
           name: "ssocapture",
           template: "{*stuff}",
           defaults: new { controller = "Account", action = "SingleSignOn" },
           constraints: new { stuff= @"URLToken=" }  );

    routes.MapRoute(
           name: "default",
           template: "{controller=home}/{action=index}/{id?}");
}); 

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

http://test.server.com/account/singlesignon?URLToken=4abc4567ed...

Что я упускаю / делаю неправильно?

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Маршруты не предназначены для этого.Чтобы достичь своих целей, просто добавьте промежуточное ПО до UseMVC()

app.Use((ctx , next)=>{
    var token = ctx.Request.Query["URLToken"].FirstOrDefault();
    if(token!=null){
        ctx.Response.Redirect($"somecontroller/specificaction/{token}"); // redirect as you like
        // might be :
        //  ctx.Response.Redirect($"Account/SingleSignOn/{token}");
    }
    return next();
});

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});
0 голосов
/ 03 мая 2019

Я думаю, что это довольно легко сделать в вашем контроллере, если вы не хотите использовать промежуточное ПО. Другое преимущество, которое вы получите, заключается в том, что вы можете установить RouteName для всех других маршрутов и просто перенаправить на маршрут, используя метод RedirectToRoute. Итак, в вашем действии UrlToken:

[Route("[action]"]
public IActionResult SingleSignOn(string urlToken)
{
    If (!string.IsNullOrWhitespace(urlToken))
    {
        return RedirectToRoute("RouteName"):
    }
}

Чтобы вышеперечисленное сработало, вы должны указать RouteName для других действий либо с помощью AttributeRouting, либо глобально определить при запуске:

[Route("[action]", Name = "otherroute")]
public IActionResult OtherAction(string param1, string param 2)
{
    //...
}

Так что просто замените "RouteName" в вашем действии SingleSignOn на "otherroute", и оно будет работать. Если вам нужно передать параметры маршрута в «otherroute», вы можете использовать одну из перегрузок метода RedirectToRoute. Надеюсь, это поможет.

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