2015-12-08 4 views
1

Если мое приложение ASP.NET MVC развернуто по адресу http://www.foobar.com/app, то я хочу получить этот корневой URL.Где я могу получить базовый путь Uri/root?

Я хочу поэтому сделать это в каком-то месте:

var scheme = HttpContext.Current.Request.Url.Scheme; 
var host = HttpContext.Current.Request.Url.Host; 
var port = HttpContext.Current.Request.Url.IsDefaultPort 
      ? 
      string.Empty : string.Format(":{0}", HttpContext.Current.Request.Url.Port); 

var applicationRootUrl = 
      string.Format("{0}://{1}{2}", scheme, host, port); 

Вариант А Если я делаю это в Application_Start даже в Global.asax, то HttpContext.Current.Request не доступны в то время.

Вариант B Я мог бы сделать это в каком-то случае, когда поступает запрос пользователя (BeginRequest, я думаю, или что-то. Не знаю его имени, но можете посмотреть его), и проверить, если у меня уже есть основание путь, то я не реконструирую путь, иначе я создам путь к приложению.

Опция C Для этого я мог бы написать HTTP-модуль или фильтр действий.

Однако варианты B и C незначительно ухудшают производительность, поскольку они будут выполнять эту проверку с каждым запросом, хотя они будут только строить Url с первым запросом.

Итак, где я могу создать базовый url моего приложения?

PS: Я использую ASP.NET MVC 5.2.3 и таргетинг v4.6 платформы .NET (и, следовательно, v4.6 ASP.NET).

+0

Можете ли вы не просто создать статический метод в статическом классе и просто вызвать его, когда вам это нужно? – JamieD77

+0

@ JamieD77 Точно. Вопрос: *, когда * называть его, чтобы он не стоил проверки каждый раз. –

+0

это трудно сказать, так как не совсем понятно, что вы хотите с этим делать. – JamieD77

ответ

1

Вы можете построить RootURI один раз и сохранить его где-нибудь (переменная приложения, кэш памяти, ...), а затем повторно использовать его позже.

Например:

public static GetRootUri() 
{ 
    if (Application["RootUri"] == null) 
    { 
    var rootUri = ConstructRootUriHere(); 
    Application["RootUri"] = rootUri; 
    } 

    return Application["RootUri"] as string; 
} 

Во всяком случае, я не думаю, что вам нужно сделать это, поскольку это не должно влиять на производительность на всех, так что не стоит.

Смежные вопросы