gpt4 book ai didi

c# - ASP.NET Core 路由中间件将租户名称放在 url 中

转载 作者:行者123 更新时间:2023-12-04 15:38:12 25 4
gpt4 key购买 nike

我正在尝试编写一个使用租户的 Web 应用程序,并且想知道如何编写一个中间件来将租户名称添加到当前 URL。

这是我到目前为止的一个示例,但它根本不起作用。

这是我声明的路线:

routes.MapRoute(
name: "tenants",
template: "{tenantName}/{area:exists}/{controller=Home}/{action=Index}/{id?}"
);

这位于我的 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();
}
});

如果我加载我的应用程序并登录,它会显示:

https://localhost:44365/Applications/Applications

代替

https://localhost:44365/TenantName/Applications/Applications

我可以手动添加 TenantName 并且它有效,但如果我移动到另一个页面,它又会丢失。

编辑:

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

https://localhost:44365/TenantName/Applications/Applications/12345

app.UseRouter(routeBuilder => {
var template = "{tenant}/{area:exists}/{controller=Home}/{action=Index}/{id?}";
routeBuilder.MapMiddlewareRoute(template, appBuilder => {
appBuilder.Use(async (context, next) => {
var routeData = context.GetRouteData();
context.Request.Path = getNormalizedPath(routeData);
await next();
});
appBuilder.UseMvc(rb => {
rb.MapRoute(name: "tenantRoute", template: template);
});
});
});

private string getNormalizedPath(RouteData routeData)
{
var tenant = routeData.Values["tenant"];
var area = routeData.Values["area"];
var controller = routeData.Values["controller"];
var action = routeData.Values["action"];

var url = "/" + tenant + "/" + area + "/" + controller + "/" + action;
return url;
}

我也把它放在我的普通 app.UseMvc() 之前;

最佳答案

请试试这个:

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{tenantName=test}/{controller}/{action=Index}/{id?}");
});

在此之后您的网站将打开如下:

https://localhost:44365/TenantName/Applications/Applications

代替

https://localhost:44365/Applications/Applications

更新:租户名称默认为test,但可以从任何地方的路由传递。有多种方法可以做到这一点,可在网上找到。一个简单的例子可以是这样的:

[Route("{tenantName = TEST1}/{controller}/{action}/{id?}")]
public IActionResult Index()
{
return View();
}

这里的租户名称是test1,url是这样的: https://localhost:44365/test1/Applications/Applications

关于c# - ASP.NET Core 路由中间件将租户名称放在 url 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59061696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com