Как я могу разрешить ASP.NET “~” пути приложения к корню веб-сайта без присутствующего Управления?

Я хочу Решить "~ / безотносительно" из контекстов нестраницы, таких как Global.asax (HttpApplication), HttpModule, HttpHandler, и т.д. но могу только найти такие методы Разрешения характерными для Средств управления (и Page).

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

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

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

14
задан John K 7 April 2010 в 02:48
поделиться

5 ответов

Вот ответ: ASP.Net: использование System.Web.UI.Control.ResolveUrl () в общем / статическая функция

string absoluteUrl = VirtualPathUtility.ToAbsolute("~/SomePage.aspx");
35
ответ дан 1 December 2019 в 07:19
поделиться

Я не отлаживал эту хреновину, но выкладываю ее как ручное решение из-за отсутствия метода 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
ответ дан 1 December 2019 в 07:19
поделиться
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
ответ дан 1 December 2019 в 07:19
поделиться

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

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

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

1
ответ дан 1 December 2019 в 07:19
поделиться

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

0
ответ дан 1 December 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: