2010-04-07 3 views
13

Я хочу разрешить «~/whatever» из внутренних контекстов вне страницы, таких как Global.asax (HttpApplication), HttpModule, HttpHandler и т. Д., Но может найти только такие методы разрешения, специфичные для элементов управления (и страницы).Как я могу разрешить пути приложения ASP.NET к корню сайта без присутствия элемента управления?

Я думаю, что приложение должно обладать достаточными знаниями, чтобы иметь возможность отображать это вне контекста страницы. Нет? По крайней мере, это имеет смысл для меня, оно должно быть разрешимым в других обстоятельствах, где известен корень приложения.

Обновление: Причина в том, что я придерживаюсь «~» путей в файлах web.configuration и хочу разрешить их из вышеупомянутых сценариев, отличных от Control.

Обновление 2: Я пытаюсь разрешить их для корневого сайта веб-сайта, такого как поведение Control.Resolve (..), а не путь к файловой системе.

+0

Дублированный: http://stackoverflow.com/questions/26796/asp-net-using-system-web-ui-control-resolveurl-in- a-shared-static-function –

ответ

1

Вы можете сделать это, обратившись к HttpContext.Current объекта непосредственно:

var resolved = HttpContext.Current.Server.MapPath("~/whatever") 

Один момент следует отметить, что, HttpContext.Current только собирается быть не- null в контексте фактического запроса. Например, он недоступен в событии Application_Stop.

+3

Я обновил вопрос, потому что пытаюсь разрешить URL-адрес, а не файловую систему. –

0

Я не отлаживал эту присоску, но бросаю ее там как ручное решение из-за отсутствия поиска метода Resolve в .NET Framework вне Control.

Это работало для меня «~/whatever».

/// <summary> 
/// Try to resolve a web path to the current website, including the special "~/" app path. 
/// This method be used outside the context of a Control (aka Page). 
/// </summary> 
/// <param name="strWebpath">The path to try to resolve.</param> 
/// <param name="strResultUrl">The stringified resolved url (upon success).</param> 
/// <returns>true if resolution was successful in which case the out param contains a valid url, otherwise false</returns> 
/// <remarks> 
/// If a valid URL is given the same will be returned as a successful resolution. 
/// </remarks> 
/// 
static public bool TryResolveUrl(string strWebpath, out string strResultUrl) { 

    Uri uriMade = null; 
    Uri baseRequestUri = new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)); 

    // Resolve "~" to app root; 
    // and create http://currentRequest.com/webroot/formerlyTildeStuff 
    if (strWebpath.StartsWith("~")) { 
     string strWebrootRelativePath = string.Format("{0}{1}", 
      HttpContext.Current.Request.ApplicationPath, 
      strWebpath.Substring(1)); 

     if (Uri.TryCreate(baseRequestUri, strWebrootRelativePath, out uriMade)) { 
      strResultUrl = uriMade.ToString(); 
      return true; 
     } 
    } 

    // or, maybe turn given "/stuff" into http://currentRequest.com/stuff 
    if (Uri.TryCreate(baseRequestUri, strWebpath, out uriMade)) { 
     strResultUrl = uriMade.ToString(); 
     return true; 
    } 

    // or, maybe leave given valid "http://something.com/whatever" as itself 
    if (Uri.TryCreate(strWebpath, UriKind.RelativeOrAbsolute, out uriMade)) { 
     strResultUrl = uriMade.ToString(); 
     return true; 
    } 

    // otherwise, fail elegantly by returning given path unaltered.  
    strResultUrl = strWebpath; 
    return false; 
} 
0
public static string ResolveUrl(string url) 
{ 
    if (string.IsNullOrEmpty(url)) 
    { 
     throw new ArgumentException("url", "url can not be null or empty"); 
    } 
    if (url[0] != '~') 
    { 
     return url; 
    } 
    string applicationPath = HttpContext.Current.Request.ApplicationPath; 
    if (url.Length == 1) 
    { 
     return applicationPath; 
    } 
    int startIndex = 1; 
    string str2 = (applicationPath.Length > 1) ? "/" : string.Empty; 
    if ((url[1] == '/') || (url[1] == '\\')) 
    { 
     startIndex = 2; 
    } 
    return (applicationPath + str2 + url.Substring(startIndex)); 
} 
+0

Что такое сообщение 2 ответов за тот же вопрос? –

0

Вместо использования MapPath, попробуйте использовать System.AppDomain.BaseDirectory. Для веб-сайта это должно быть корнем вашего сайта. Затем выполните System.IO.Path.Combine с тем, что вы собираетесь передать в MapPath без «~».

1

В Global.asax добавить следующее:

private static string ServerPath { get; set; } 

protected void Application_BeginRequest(Object sender, EventArgs e) 
{ 
    ServerPath = BaseSiteUrl; 
} 

protected static string BaseSiteUrl 
{ 
    get 
    { 
     var context = HttpContext.Current; 
     if (context.Request.ApplicationPath != null) 
     { 
      var baseUrl = context.Request.Url.Scheme + "://" + context.Request.Url.Authority + context.Request.ApplicationPath.TrimEnd('/') + '/'; 
      return baseUrl; 
     } 
     return string.Empty; 
    } 
}