【发布时间】:2019-11-27 16:14:43
【问题描述】:
我正在尝试编写一个使用租户的 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();
【问题讨论】:
-
你有没有试过在
public async Task InvokeAsync(HttpContext context)里面做这个操作 -
您好!我不太明白你的意思?我认为我不能在我的配置部分中使用它?
-
抱歉,这是注册中间件的另一种方式,您将创建一个扩展方法并在您的配置方法
IApplicationBuilder UseClientNameMapper(this IApplicationBuilder applicationBuilder)中调用它。在启动配置方法app.UseClientNameMapper(); -
感谢您的回复。你有我可以关注的样本吗?我真的不明白你在说什么。
标签: c# asp.net-core .net-core asp.net-core-mvc