Подтвердить что ты не робот

MVC 3 Поддоменная маршрутизация

Возможный дубликат:
Возможно ли создать маршрут ASP.NET MVC на основе поддомена?

В asp.net MVC 3 сайте я бы хотел создать интернет-магазины для пользователей. Любой магазин, созданный пользователем, должен иметь URL-адрес, например " shopname.mydomain.com".

Я пробовал какую-то работу по маршрутизации, но вообще не работал. Я исследую решение, но не могу найти правильное решение.

Моя цель такова; если я могу добавить маршрут для управления любым запросом, который пытается найти поддомен, я проверю, является ли он именем интернет-магазина пользователя и получает динамические данные в игре.

Нужна помощь в маршрутизации:) Спасибо.

4b9b3361

Ответ 1

Я нашел очень мощный способ. Поэтому проверьте это:)

Прежде всего, для сервера разработки приложений визуальной студии вам нужно отредактировать файл "hosts".

Откройте блокнот как администратор. Добавьте любое имя для своего домена что-то вроде

127.0.0.1 mydomain.com 127.0.0.1 sub1.mydomain.com

и что вам нужно использовать при разработке.

После этого укажите свой номер порта в своем веб-проекте. Например, "45499". Таким образом, вы сможете отправить запрос в свой проект, написав в браузере:

mydomain.com:45499 или sub1.mydomain.com:45499

Это был подготовительный шаг. Давайте ответим.

Используя класс IRouteConstraint, вы можете создать свои ограничения маршрута.

public class SubdomainRouteConstraint : IRouteConstraint
{
    private readonly string SubdomainWithDot;

    public SubdomainRouteConstraint(string subdomainWithDot)
    {
        SubdomainWithDot = subdomainWithDot;
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var url = httpContext.Request.Headers["HOST"];
        var index = url.IndexOf(".");

        if (index < 0)
        {
            return false;
        }
        //This will bi not enough in real web. Because the domain names will end with ".com",".net"
        //so probably there will be a "." in url.So check if the sub is not "yourdomainname" or "www" at runtime.
        var sub = url.Split('.')[0];
        if(sub == "www" || sub == "yourdomainname" || sub == "mail")
        {
            return false;
        }

        //Add a custom parameter named "user". Anything you like :)
        values.Add("user", );
        return true;
    }
}

И добавьте свой ограничитель в любом маршруте, который вы хотели бы использовать.

routes.MapRoute(
                    "Sub", // Route name
                    "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "SubdomainController", action = "AnyActionYouLike", id = UrlParameter.Optional },
                    new { controller = new SubdomainRouteConstraint("abc.") },
                    new[] { "MyProjectNameSpace.Controllers" }
                    ); 

Поместите эти маршруты до вашего маршрута по умолчанию. Это все.

В ограничении вы можете делать что-либо вроде проверки для имени поддомена - это имя магазина клиента или что-то еще.

Ответ 2

Вам нужно будет добавить запись dns для *.mydomain.com, чтобы указать на корневое приложение, затем при обработке запроса в корневом приложении проверьте узел запроса, чтобы определить, какой shopname указан.