Как настроить маршрутизацию URL-адресов asp.net на основе домена/хоста?

Как лучше всего настроить путь назначения для таблицы маршрутизации, созданной в событии global.asax Application_Start, на основе домена/поддомена/узла? В IIS6 работало следующее, но в IIS7 объект запроса отделен от события Application_Start и поэтому больше не работает:

Dim strHost As String = Context.Request.Url.Host  
Dim strDir As String = ""  
If strHost.Contains("domain1.com") Then  
    strDir = "area1/"  
Else  
    strDir = "area2/"  
End If  
routes.MapPageRoute("Search", "Search", "~/" & strDir & "search.aspx") 

person DrewF    schedule 08.05.2010    source источник


Ответы (2)


Кажется, я решил свою проблему. Вы не можете получить доступ к объекту Request в Application_Start с помощью IIS7.0, хотя вы можете использовать его в пользовательском ограничении маршрута. Вот как я это сделал.

Определите пользовательское ограничение маршрута:

Imports System.Web
Imports System.Web.Routing

Public Class ConstraintHost
    Implements IRouteConstraint

    Private _value As String

    Sub New(ByVal value As String)
        _value = value
    End Sub

    Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match
        Dim hostURL = httpContext.Request.Url.Host.ToString()
        Return hostURL.IndexOf(_value, StringComparison.OrdinalIgnoreCase) >= 0
    End Function
End Class

Затем определите маршрут:

routes.MapPageRoute(
    "Search_Area1",
    "Search",
    "~/area1/search.aspx",
    True,
    Nothing,
    New RouteValueDictionary(New With {.ArbitraryParamName = New ConstraintHost("domain1.com")})
)

routes.MapPageRoute(
    "Search_Area2",
    "Search",
    "~/area2/search.aspx")
)

Этот метод также можно использовать для применения различной маршрутизации на основе субдомена.

Большое спасибо Стивену Уотеру за маршрутизацию asp.net mvc. за то, что указали мне правильное направление (хотя это было для mvc, а не для веб-форм).

person DrewF    schedule 10.05.2010

Это параметр, который вы могли бы вместо этого прочитать из web.config? ‹- моя рекомендация.

Этот пост помогает?

http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx< /а>

person Raj Kaimal    schedule 09.05.2010
comment
Мой пример упрощен из фактической реализации, и задействованная логика не будет работать при использовании web.config (определение статических маршрутов). Да, я видел эту статью. Я не верю, что сопоставление маршрута перемещения страницы с begin_request будет работать, и AppDomainAppVirtualPath не помогает, поскольку у меня есть логика, основанная на имени хоста. Я предполагаю, что решение как-то связано с перегрузкой средств, с помощью которых маршрутизация запускается на уровне запроса страницы, а не там, где определены маршруты (в application_start). Я просто понятия не имею, как это сделать. Любые идеи или предложения? - person DrewF; 09.05.2010
comment
Я говорил о сохранении domain1.com в вашем web.config в настройках приложений. - person Raj Kaimal; 09.05.2010