c# - ASP.NET Core 路由中间件在 url 中放置租户名称
问题描述
我正在尝试编写一个使用租户的 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/TenantName/Applications/Applications
我可以手动添加 TenantName 并且它可以工作,但是如果我移动到另一个页面,它会再次丢失。
编辑:
我尝试创建一个自定义路由构建器,但如果我的网址是这样的,它就不起作用
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();
解决方案
Please try this:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{tenantName=test}/{controller}/{action=Index}/{id?}");
});
After this your your site will open like:
https://localhost:44365/TenantName/Applications/Applications
instead of
https://localhost:44365/Applications/Applications
Update: tenant name by default is test but can be passed from route at any place. There are multiple ways to do that, available on web. A simple example can be like:
[Route("{tenantName = TEST1}/{controller}/{action}/{id?}")]
public IActionResult Index()
{
return View();
}
Here tenant name is test1, url is like: https://localhost:44365/test1/Applications/Applications
推荐阅读
- javascript - 对象键顺序
- c++ - ABI 规范中的内存布局是否仅适用于 ABI 边界?
- c# - 如何在 NEST 术语聚合查询 c# 中获得与 kibana 或 postman 一样的 Elasticsearch 结果
- swift - 如何从闭包中检索要在函数中返回的值?
- vue.js - 如何在 vue-good-table 中使用带有复选框表的按钮
- django - 无法在 Django 模型中定义 ForeignKey 字段
- python - 如何在 Python 循环中有双计数器变量?
- c++ - 如何在 C++ 中将 Concurrency::streams::istream 转换为 std::istream
- javascript - 使用 React.js 存储错误 - TypeError: Object(...) is not a function react
- r - R - 基于折叠列的数据框的单独行