2010-04-07 26 views
13

Tôi muốn giải quyết "~/bất cứ điều gì" từ bên trong ngữ cảnh không phải trang như Global.asax (HttpApplication), HttpModule, HttpHandler, vv nhưng chỉ có thể tìm thấy các phương pháp giải quyết cụ thể cho Điều khiển (và Trang).Làm thế nào tôi có thể giải quyết đường dẫn ứng dụng ASP.NET "~" đến gốc trang web mà không có Kiểm soát đang có mặt?

Tôi nghĩ ứng dụng phải có đủ kiến ​​thức để có thể ánh xạ điều này bên ngoài ngữ cảnh Trang. Không? Hoặc ít nhất nó có ý nghĩa với tôi nó phải được giải quyết trong các trường hợp khác, bất cứ nơi nào gốc ứng dụng được biết đến.

Cập nhật: Lý do tôi đang gắn đường dẫn "~" vào tệp web.configuration và muốn giải quyết chúng từ các trường hợp không kiểm soát nói trên.

Cập nhật 2: Tôi đang cố giải quyết chúng tới gốc trang web chẳng hạn như Control.Resolve (..) Hành vi URL, chứ không phải đường dẫn hệ thống tệp.

+0

Nhân đôi: http://stackoverflow.com/questions/26796/asp-net-using-system-web-ui-control-resolveurl-in- a-shared-static-function –

Trả lời

1

Bạn có thể làm điều đó bằng cách truy cập các đối tượng HttpContext.Current trực tiếp:

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

Một điểm cần lưu ý là, HttpContext.Current chỉ sẽ không null trong bối cảnh của một yêu cầu thực tế. Ví dụ: không có sẵn trong sự kiện Application_Stop.

+3

Tôi đã cập nhật câu hỏi vì tôi đang cố gắng giải quyết URL, không phải hệ thống tệp. –

0

Tôi chưa sửa lỗi sucker này nhưng đang ném nó của chúng tôi ở đó như là một giải pháp thủ công cho việc thiếu tìm kiếm một phương pháp Resolve trong .NET Framework bên ngoài Control.

Điều này đã hoạt động trên "~/bất kỳ điều gì" đối với tôi.

/// <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

Điểm đăng 2 câu trả lời cho cùng một câu hỏi là gì? –

0

Thay vì sử dụng MapPath, hãy thử sử dụng System.AppDomain.BaseDirectory. Đối với một trang web, điều này phải là gốc của trang web của bạn. Sau đó, thực hiện System.IO.Path.Combine với bất kỳ thứ gì bạn sẽ chuyển tới MapPath mà không có dấu "~".

1

Trong Global.asax thêm như sau:

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; 
    } 
}