我需要捕获任何包含 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 ...
我在想什么/做错了什么?
答案 0 :(得分:1)
路由并非旨在做到这一点。要实现您的目标,只需在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?}");
});
答案 1 :(得分:0)
如果您不想使用中间件,我认为在您的控制器中很容易做到。您将获得的另一个好处是,您可以为所有其他路由设置RouteName,并使用RedirectToRoute
方法将其重定向到该路由。因此,在您的UrlToken动作中:
[Route("[action]"]
public IActionResult SingleSignOn(string urlToken)
{
If (!string.IsNullOrWhitespace(urlToken))
{
return RedirectToRoute("RouteName"):
}
}
要使上述方法起作用,您必须通过使用AttributeRouting或在启动时全局定义为其他操作指定RouteName:
[Route("[action]", Name = "otherroute")]
public IActionResult OtherAction(string param1, string param 2)
{
//...
}
因此,只需将您的SingleSignOn
动作中的“ RouteName”替换为“ otherroute”,即可使用。如果需要将路由参数传递给“ otherroute”,则可以使用RedirectToRoute
方法的重载之一。我希望这会有所帮助。