2009-04-29 3 views
7

Мне нужно создать URL-адрес страницы в String, чтобы отправить ему электронное письмо (как часть системы проверки электронной почты). Если я использую символ ~ для обозначения корня приложения, это берется буквально.Найти корневой URL-адрес приложения без использования ~

Приложение будет развернуто на сервере на трех разных сайтах (на разных портах), и каждый сайт может быть доступен через два разных URL (один для LAn и один для Интернета).

Так что жесткого кодирования URL-адреса не может быть и речи. Я хочу построить URL для verify.aspx в моем приложении

Пожалуйста, помогите

+0

Собираетесь ли вы отправлять из другой URL, если они находятся внутри локальной сети, или вы хотите, чтобы быть такой же URL? – rjzii

+0

Это поможет увидеть фактический код, как вы пытаетесь построить эту строку. – Roman

ответ

13

К сожалению, ни один из перечисленных методов не генерируется полный URL, начиная с http://---.

Так что я должен был извлечь их из request.url. Что-то вроде этого

Uri url=HttpContext.Current.Request.Url; 
StringBuilder urlString = new StringBuilder(); 
urlString.Append(url.Scheme); 
urlString.Append("://"); 
urlString.Append(url.Authority); 
urlString.Append("/MyDesiredPath"); 

Может ли кто-нибудь выявить любые потенциальные проблемы с этим?

+0

Приятно узнать о собственности Власти, спасибо –

2

Вы должны поместить URL как часть конфигурации вашего веб-приложения. Веб-приложение не знает, как его можно достичь из внешнего мира.

E.g. рассмотрите сценарий, в котором есть несколько прокси-серверов и балансировщики нагрузки перед вашим веб-сервером ... как веб-сервер знал бы что-нибудь, кроме своего собственного IP-адреса?

Итак, вам необходимо настроить каждый экземпляр вашего веб-приложения, добавив базовый URL, например. как приложение в своем web.config.

0

Вы можете использовать свой собственный (docs here) свой URL, но если вы находитесь за любым перенаправлением, RawURL может не отражать фактический URL вашего приложения.

13

Вам нужно это:

HttpContext.Current.Request.ApplicationPath 

Это эквивалентно "~" в URL-адресе.

http://msdn.microsoft.com/en-us/library/system.web.httprequest.applicationpath.aspx

+2

ApplicationPath не создает URL-адрес, который можно использовать в письме. Для электронной почты вам понадобится полный URL-адрес, в комплекте с «http: //.../» и т. Д. ApplicationPath предоставит вам только «/». –

3

Try:

HttpRequest req = HttpContext.Current.Request; 
string url = req.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.SafeUnescaped) 
    + ((req.ApplicationPath.Length > 1) ? req.ApplicationPath : ""); 
0

Я закончил с этим. Я беру URL-адрес запроса и использую позицию Request.ApplicationRoot, чтобы открыть левую часть uri. Должен работать с приложениями, размещенными в виртуальном каталоге «/ example» или в корневой папке «/».

private string GetFullUrl(string relativeUrl) 
    { 
     if (string.IsNullOrWhiteSpace(relativeUrl)) 
      throw new ArgumentNullException("relativeUrl"); 

     if (!relativeUrl.StartsWith("/")) 
      throw new ArgumentException("url should start with /", "relativeUrl"); 

     string current = Request.Url.ToString(); 
     string applicationPath = Request.ApplicationPath; 
     int applicationPathIndex = current.IndexOf(applicationPath, 10, StringComparison.InvariantCultureIgnoreCase); 

     // should not be possible 
     if (applicationPathIndex == -1) throw new InvalidOperationException("Unable to derive root path"); 

     string basePath = current.Substring(0, applicationPathIndex); 
     string fullRoot = string.Concat(
      basePath, 
      (applicationPath == "/") ? string.Empty : applicationPath, 
      relativeUrl); 

     return fullRoot; 
    } 
0

Это всегда работает для меня:

string root = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery, ""); 
+2

Пожалуйста, см. Вопросы [как ответить] (http://stackoverflow.com/help/how-to-answer) на SO. – techspider

+0

Я не понимал нисходящее движение. Что-то не так с предложенным решением? – erionpc

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