单个MVC Web应用程序,具有多个URL重定向到不同的控制器

14 浏览
0 Comments

单个MVC Web应用程序,具有多个URL重定向到不同的控制器

是否可能使用子域信息来确定ASP.NET MVC路由?例如:\n

    \n

  • user1.domain.example 转到一个地方
  • \n

  • user2.domain.example 转到另一个地方?
  • \n

\n或者,我可以让这两个都转到同一个带有username参数的控制器/操作吗?

0
0 Comments

问题的出现原因是在单一MVC Web应用程序中,需要根据不同的URL重定向到不同的控制器。解决方法是使用Maartin Balliauw编写的代码,该代码创建了一个DomainRoute类,可以与普通路由非常相似地使用。

这个解决方案有一个问题。假设你想将子域名作为不同的用户处理:routes.Add("SD", new DomainRoute("user}.localhost", "", new { controller = "Home", action = "IndexForUser", user="u1" } )); 它也会缓存主页。这是因为生成的正则表达式的原因。为了解决这个问题,你可以在DomainRoute.cs中复制CreateRegex方法,将其命名为CreateDomainRegex,将此行上的*更改为+:source = source.Replace("}", @">([a-zA-Z0-9_]*))"); 并在GetRouteData方法中使用这个新方法作为域名正则表达式:domainRegex = CreateDomainRegex(Domain)。

作者在测试代码时遇到了问题,他无法运行代码,只收到了"SERVER NOT FOUND"错误。他询问是否需要进行其他配置。

对于localhost的测试,可以在web.config中设置base DNS域。典型的值可能是.example.org。另外,如果项目运行在localhost:42323上,可以使用localhost:42323作为URL进行测试。

0
0 Comments

这篇文章介绍了在使用MVC5进行路由时,如何捕获子域名并保留标准的MVC5路由特性,并提供了相关的解决方法。

文章中提到了使用SubdomainRoute类来捕获子域名,这个类是从Route类派生出来的。SubdomainRoute类还允许将子域名作为查询参数来指定,这样可以在配置DNS子域名之前进行测试。同时,使用查询参数还可以在Visual Studio 2013中进行本地调试,而无需进行netsh配置或以管理员身份运行。默认情况下,IIS Express只绑定到localhost,而不会绑定到类似sub.localtest.me这样的同义主机名。

文章中给出了SubdomainRoute类的代码实现,包括GetRouteData和GetVirtualPath方法的重写,以及MapSubdomainRoute方法的定义。同时,还给出了一个有用的建议,即创建一个Controller基类,其中包含Subdomain属性,可以方便地访问子域名。

最后,文章中还回答了一个问题,即是否可以在使用路由属性时使用这种方法。回答是不可以,但可以构建自己的属性路由系统来实现类似的功能。

这篇文章介绍了如何在MVC5中捕获子域名并保留标准的MVC5路由特性,同时给出了相应的代码实现和解决方法。

0
0 Comments

问题的原因是需要在单个MVC Web应用程序中使用多个URL重定向到不同的控制器。解决方法是创建一个新的路由,并将其添加到全局.asax的路由集合中。

以下是一个简单的自定义路由示例:

public class ExampleRoute : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var url = httpContext.Request.Headers["HOST"];
        var index = url.IndexOf(".");
        if (index < 0)
            return null;
        var subDomain = url.Substring(0, index);
        if (subDomain == "user1")
        {
            var routeData = new RouteData(this, new MvcRouteHandler());
            routeData.Values.Add("controller", "User1"); //跳转到User1Controller类
            routeData.Values.Add("action", "Index"); //跳转到User1Controller的Index方法
            return routeData;
        }
        if (subDomain == "user2")
        {
            var routeData = new RouteData(this, new MvcRouteHandler());
            routeData.Values.Add("controller", "User2"); //跳转到User2Controller类
            routeData.Values.Add("action", "Index"); //跳转到User2Controller的Index方法
            return routeData;
        }
        return null;
    }
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        //在这里实现你的URL格式化
        return null;
    }
}

在全局.asax中的RegisterRoutes方法中,可以通过以下方式执行.Add操作:

routes.Add(new ExampleRoute());

这种方法是否需要硬编码可能的子域名列表?

不需要,可以添加一个名为"subdomain"的数据库字段,该字段将是你期望的特定用户的子域名,或者其他任何内容,然后只需对子域名进行查找。

有人可以推荐一个WebForms版本吗?

0