如何将此路由配置从.net3.1 转换为.net5?

How to convert this routing configuration from .net3.1 to .net5?

我在 localhost:5001 上有一个 api 运行,在我的 ASP.NET MVC 应用程序中我可以这样做:

routes.MapRoute(
name: "Default",
url: "{*stuff}",
defaults: new { controller = "Default", action = "DefaultAction" }
);

这意味着我可以简单地在我的网络浏览器中键入 localhost:5001/aRandomStuff,然后“aRandomStuff”将作为参数传入我的 [=14] 中的 actionresult DefaultAction =].

下.net5做这种路由有什么等价的
 app.UseEndpoints(endpoints =>
        {
            //routing here
        });

?

您可以直接在端点上使用 RouteAttribute

只需在 Startup.cs 中映射您的默认控制器(如果您需要默认控制器):

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

然后在您的控制器中为您想要的操作添加 Route 属性。:

    [Route("{id}")]
    public IActionResult DefaultAction(string id)
    {
        return View();
    }

因为在这种情况下只有端点有参数 {} 路由定义而控制器没有,所以上述端点将从 localhost:5001/whateverStringwhateverString 将作为值发送到参数 id.

我需要编辑我的原始答案,因为它是针对 Api 端点的。编辑后的答案应该适用于您的 MVC 应用程序。

他们对 .Net 5 中的路由进行了许多更新,这确实扰乱了我们对 catch-all 路由的看法。这些实际上是有意的,并且在技术上是他们希望它如何工作的。然而,它给我们大多数人带来了很多来自 POV 的困惑。你可以看到一些讨论和错误日志 here, here, and here.

我无法让它在启动时与 UseEndpoints 一起工作。正如第一个 link 所示,优先级控制器的顺序也很混乱,这里的其他答案可能会导致路由冲突或其他最重要路由的混淆。

我看到它起作用的唯一方法是在我们设置顺序的控制器中使用路由属性。这意味着您知道这将是最后检查的模式:

[Route("{*url}", Order = 999)]
public IActionResult MyCatchAll(string url)
{
   ...
}

这样优先顺序将排在最后(我认为大多数都在 0-5 之间,所以 999 已经足够高了)并且 url 作为参数传递,供您根据需要进行管理。坦率地说,我更喜欢这个,但选择做任何一个都很好。

如果 app.UseEndpoints 中有人有办法做到这一点,我很乐意看到它,但所有样本都失败了,或者只是偶尔为我工作。

在下面的代码中,DefaultAction() 方法使用带有正则表达式的路由属性。所有具有以下格式 localhost:port/SomeStringStuff 的 URL 都将由该操作方法处理。

[ApiController]
[Route("[controller]")]
public class DefaultController : ControllerBase
{
    [HttpGet]       
    [Route(@"/{text:regex(.*Stuff$)}")]
    public string DefaultAction(string text)
    {
        /// your code ...
        return text;
    }
}

考虑到 ASP.NET 核心框架将 RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant 添加到正则表达式构造函数。

app.UseEndpoints(endpoints =>
     {
         endpoints.MapControllers();
     });

在您的操作中使用此模式并捕获所有请求并像这样获取第一个路由值

    [Route("/{**catchAll}")]
    public IActionResult Index()
    {
        string randomQuery =HttpContext.Request.RouteValues["catchAll"]?.ToString();
        
        return Content(randomQuery);
    }

试试这个

app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Default}/{action=DefaultAction}/{id?}");
        });

    [Route("{id}")]
    [Route("~/{id}")]
    public IActionResult DefaultAction(string id)
    {
        return View();
    }