Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心路由中间件在url中放置租户名称_C#_Asp.net Core_.net Core_Asp.net Core Mvc - Fatal编程技术网

C# ASP.NET核心路由中间件在url中放置租户名称

C# ASP.NET核心路由中间件在url中放置租户名称,c#,asp.net-core,.net-core,asp.net-core-mvc,C#,Asp.net Core,.net Core,Asp.net Core Mvc,我正在尝试编写一个使用租户的webapp,我想知道如何编写一个中间件将租户名称添加到当前URL 这是一个样本,我到目前为止,它根本不工作 这是我宣布的路线: routes.MapRoute( name: "tenants", template: "{tenantName}/{area:exists}/{controller=Home}/{action=Index}/{id?}" ); 这将放置在my Startup.cs的配置部分 app.Use(async (context, nex

我正在尝试编写一个使用租户的webapp,我想知道如何编写一个中间件将租户名称添加到当前URL

这是一个样本,我到目前为止,它根本不工作

这是我宣布的路线:

routes.MapRoute(
  name: "tenants",
  template: "{tenantName}/{area:exists}/{controller=Home}/{action=Index}/{id?}"
);
这将放置在my Startup.cs的配置部分

app.Use(async (context, next) => {
    if (context.User.Identity.IsAuthenticated == true)
    {
        string originalPath = context.Request.Path.Value;
        context.Items["originalPath"] = originalPath;
        var additionalPath = "/TenantName" + originalPath;
        context.Request.Path = additionalPath;
        await next();
    }
});
如果我加载应用程序并登录,它会显示以下内容:

而不是

我可以手动添加租户名称,但如果我移动到另一个页面,它会再次丢失

编辑:

我尝试创建一个自定义路由生成器,但如果我的url是这样的,它就不起作用

我也把它放在了我的普通应用程序之前

请尝试以下操作:

app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{tenantName=test}/{controller}/{action=Index}/{id?}");
    });
在此之后,您的站点将打开,如下所示:

而不是

更新:默认情况下,租户名称是测试名称,但可以在任何位置从路由传递。有多种方法可以做到这一点,可以在web上找到。一个简单的例子如下:

[Route("{tenantName = TEST1}/{controller}/{action}/{id?}")]
public IActionResult Index()
{
   return View();
}
这里的租户名称是test1,url类似于:

您是否尝试过在
公共异步任务InvokeAsync(HttpContext上下文)
你好!我不太明白你的意思?我认为我不能在配置部分中使用它?抱歉,这是注册中间件的另一种方法,您将创建一个扩展方法,并在配置方法中调用它
iaApplicationBuilder UseClientNameMapper(此iaApplicationBuilder applicationBuilder)
。在启动时配置方法
app.UseClientNameMapper()谢谢回复。你们有什么样的样品可以给我吗?我真的不明白你在说什么。你好,谢谢你的回答。但现在测试是静态的。有没有办法通过cookie获取它并将其替换到url中?您可以从cookie甚至配置文件中获取它,并在稍后的更新中设置。现在的问题是,我不知道如何实际更改租户名称。我是在actionfilter中完成的吗?是的,actionfilter是一个很好的地方,您可以创建一个自定义的actionfilter,并将其用于所有视图。否则,路由本身就是actionfilter。若这个名称是静态的,你们也可以在启动文件中硬编码
[Route("{tenantName = TEST1}/{controller}/{action}/{id?}")]
public IActionResult Index()
{
   return View();
}