.net核心路由到基于当前域名的剃须刀页面区域?

Posted

技术标签:

【中文标题】.net核心路由到基于当前域名的剃须刀页面区域?【英文标题】:.net core routing to a razor pages area based on current domain name? 【发布时间】:2019-03-03 23:07:35 【问题描述】:

我目前正在尝试构建一个应用程序以从单个 .net 核心应用程序托管多个网站。

理想情况下,我希望根据访问应用程序的域名显示完全不同的 Razor 页面。

理想情况下,我希望将我的剃须刀页面分解为多个区域,每个区域与不同的域名相关联。 IE www.domain1.com 是 domain1 区域,www.domain2.com 是 domain2 区域,每个区域都有自己的页面索引等。

因此,如果有人从 www.domain1.com/aboutus 访问该应用程序,它会将他们定向到位于我的应用程序的 Area/Domain1/Pages/AboutUs 部分的剃须刀页面。

同样,如果我的应用程序收到对 www.domain2.com/aboutus 的请求,他们会看到位于 Area/Domain2/Pages/Aboutus 下的关于我们页面。

我已经搜索了几个小时,但我无法弄清楚您是如何使用剃须刀页面区域功能完成此操作的。我能找到的唯一信息是如何使用带有香草 MVC 的区域来完成此操作。

这是一个很好的例子。

Different domain in the same app ASP.NET Core 2.0

我不知道如何使用剃须刀页面完成相同类型的事情。

【问题讨论】:

按区域是指asp.net mvc 区域还是只是一个子文件夹?你有机会检查aspnetboilerplate.com 或cloudscribe.com。您可以学习并适应他们已经解决的问题,而不是从头开始。 MVC 区域,在 2.1 中被添加到剃须刀页面。 mikesdotnetting.com/article/324/areas-in-razor-pages 但是,我不知道如何使用域名来限制到特定区域的路由。 【参考方案1】:

我不确定为此使用区域的可扩展性如何,但您可以使用中间件来识别域并基于该区域提供来自区域的内容,例如,其中“bloggs”是区域的名称bloggs.com 域:

public class AreaRoutingMiddleware

    private readonly RequestDelegate _next;

    public AreaRoutingMiddleware(RequestDelegate next)
    
        _next = next;
    

    public async Task Invoke(HttpContext context)
    
        if(context.Request.Host.ToString() == "bloggs.com")
        
            context.Request.Path = "/bloggs" + context.Request.Path;
        
        await _next.Invoke(context);
    

您可能还需要添加文件类型检查,除非所有文件(css、js、favicon 等)也位于相应区域中。

【讨论】:

我只是遇到了完全相同的问题,中间件在调试模式下工作正常,但在部署到我的服务器时不起作用。我有 2 个域指向同一个服务器 IP,但不知何故,中间件总是被跳过。我可以在我的服务器日志中看到正确的请求正在进来,所以肯定是我的应用程序正在改变请求字符串。

以上是关于.net核心路由到基于当前域名的剃须刀页面区域?的主要内容,如果未能解决你的问题,请参考以下文章

MVC和同一项目.net核心中的剃刀页面区域

ASP.net core 3.1 中控制器和剃须刀页面之间的路由

到基础 Razor 页面的多个别名路由

.net 5 剃须刀页面路由

在剃须刀页面应用程序中路由到 ApiController?

如何在asp.net核心剃须刀页面中显示主/详细模式弹出