C# ASP.NET核心路由中间件在url中放置租户名称
我正在尝试编写一个使用租户的webapp,我想知道如何编写一个中间件将租户名称添加到当前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
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();
}