gpt4 book ai didi

c# - IApplicationBuilder Map 分支在 ASP.NET 5 中无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-03 10:25:47 25 4
gpt4 key购买 nike

我正在尝试根据请求 URL 的第一个文件夹段实现 Multi-Tenancy 。

考虑我的初创公司的以下片段。

foreach (SiteFolder f in allFolders)
{
PathString path = new PathString("/" + f.FolderName);
app.Map(path,
siteApp =>
{
//here I'm trying to specify a different auth cookie name for folder sites and some other configuration
// but problem happens even with no code here at all
// I also tried adding the folder specific routes here but still 404
});
}

app.UseMvc(routes =>
{
List<SiteFolder> allFolders = siteRepo.GetAllSiteFoldersNonAsync();

foreach (SiteFolder f in allFolders)
{
routes.MapRoute(
name: f.FolderName + "Default",
template: f.FolderName + "/{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" },
constraints: new { name = new SiteFolderRouteConstraint(f.FolderName) }
);

routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});

如果我在顶部注释掉 app.Map,那么我的路由会按预期工作,否则如果我在与我的文件夹路由相同的文件夹名称上进行分支,则文件夹 url 都会导致 IIS 404 页面。

我想也许 siteApp 没有看到添加到应用程序的路由,所以我尝试将路由添加到 siteApp 但它仍然导致 404。

类似的方法在 MVC 5 中对我有用,我觉得要么框架 (beta5) 中存在错误,要么我遗漏了一些关于分支和新框架的重要概念。

最佳答案

这正是 Map 在 Katana 中的工作方式,并且应该在 ASP.NET 5 中工作。

Map 最重要的一点是,它总是在请求路径与注册路径对应时终止请求。换句话说,当路径与路径参数匹配时,在 app.Map 调用之后注册的中间件永远不会执行,这就是为什么你的 app.UseMvc 中间件永远不会在你的配置。

由于您不在 app.Map 委托(delegate)中处理请求,因此会执行默认处理程序并应用 404 响应。

您应该试试这个扩展方法。与 app.Map 不同,它从不停止处理请求,并且基本上启用了我称之为“条件中间件处理”的场景:

public static IApplicationBuilder UseWhen(
[NotNull] this IApplicationBuilder app,
[NotNull] Func<HttpContext, bool> condition,
[NotNull] Action<IApplicationBuilder> configuration) {
var builder = app.New();
configuration(builder);

return app.Use(next => {
builder.Run(next);

var branch = builder.Build();

return context => {
if (condition(context)) {
return branch(context);
}

return next(context);
};
});
}

它是专门为 AspNet.Security.OpenIdConnect.Server 示例开发的,但您当然可以在任何地方使用它。

你可以在那里看到它的运行情况:https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server/blob/vNext/samples/Mvc/Mvc.Server/Startup.cs#L46-L80

// Create a new branch where the registered middleware will be executed only for API calls.
app.UseWhen(context => context.Request.Path.StartsWithSegments(new PathString("/api")), branch => {
branch.UseOAuthBearerAuthentication(options => {
options.AutomaticAuthentication = true;
options.Audience = "http://localhost:54540/";
options.Authority = "http://localhost:54540/";
});
});

关于c# - IApplicationBuilder Map 分支在 ASP.NET 5 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31629432/

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