Asp.net mvc 2 如何将主机名包括在MVC2路由映射中?

Asp.net mvc 2 如何将主机名包括在MVC2路由映射中?,asp.net-mvc-2,Asp.net Mvc 2,我有3个域名都指向同一个MVC2应用程序。我现在得到的是homecontroller充当交通警察,并重定向到控制器和视图以获取特定主机名。但我不喜欢这导致的URI结果 例: www.webhost1.com/webhost1/imagegallery www.webhost2.com/webhost2/imagegallery 我想要: www.webhost1.com/imagegallery 是否有办法在global.asax中定义路由,将主机名包括在路由评估中,以便URI看起来不那么冗余?

我有3个域名都指向同一个MVC2应用程序。我现在得到的是homecontroller充当交通警察,并重定向到控制器和视图以获取特定主机名。但我不喜欢这导致的URI结果

例: www.webhost1.com/webhost1/imagegallery www.webhost2.com/webhost2/imagegallery

我想要:

www.webhost1.com/imagegallery


是否有办法在global.asax中定义路由,将主机名包括在路由评估中,以便URI看起来不那么冗余?

Aha!,这需要一点修改(和一个高峰在和旧的书),但我认为我已经解决了它

您需要创建自定义管线约束。 这是我快速制作的:

 public class hostnameConstraint : IRouteConstraint
    {
        protected string _hostname;

        public hostnameConstraint (string hostname)
        {
            _hostname = hostname;
        }

        bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            if (httpContext.Request.Url.Host == _hostname)
                return true;
            return false;
        }
    }
然后,您只需将其添加到路由中,并指定要应用路由的主机名。像这样:

routes.MapRoute(
            "ImageGallery", "{controller}/{action}",
            new { controller = "Home", action = "Index"},
            new { hostname = new hostnameConstraint("webhost1.com") }
        );

routes.MapRoute(
            "ImageGallery", "{controller}/{action}",
            new { controller = "Home", action = "Index"},
            new { hostname = new hostnameConstraint("webhost2.com") }
        );

等等等等。我不知道您的路由是如何布置的,但关键是现在您可以为主机名设置单独的路由。这应该能让你做你想做的事。

啊哈!,这需要一点修改(和一个高峰在和旧的书),但我认为我已经解决了它

您需要创建自定义管线约束。 这是我快速制作的:

 public class hostnameConstraint : IRouteConstraint
    {
        protected string _hostname;

        public hostnameConstraint (string hostname)
        {
            _hostname = hostname;
        }

        bool IRouteConstraint.Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            if (httpContext.Request.Url.Host == _hostname)
                return true;
            return false;
        }
    }
然后,您只需将其添加到路由中,并指定要应用路由的主机名。像这样:

routes.MapRoute(
            "ImageGallery", "{controller}/{action}",
            new { controller = "Home", action = "Index"},
            new { hostname = new hostnameConstraint("webhost1.com") }
        );

routes.MapRoute(
            "ImageGallery", "{controller}/{action}",
            new { controller = "Home", action = "Index"},
            new { hostname = new hostnameConstraint("webhost2.com") }
        );

等等等等。我不知道您的路由是如何布置的,但关键是现在您可以为主机名设置单独的路由。这应该能让你做你想做的事。

先生,你是我的英雄!我刚刚测试了这个,它工作得很好。这太棒了。正是我要找的。我正在创建一个网站,我们可以主机域重定向。我希望该网站管理域以及重定向。添加具有此约束的路由允许我将正常站点置于主机域下,并且任何其他域都将相应重定向。谢谢先生,你是我的英雄!我刚刚测试了这个,它工作得很好。这太棒了。正是我要找的。我正在创建一个网站,我们可以主机域重定向。我希望该网站管理域以及重定向。添加具有此约束的路由允许我将正常站点置于主机域下,并且任何其他域都将相应重定向。谢谢