2012-05-01 35 views
3

我正在編寫一個通用庫供我的所有Web項目使用。其中一個功能是永久重定向如下:解析相對(「〜」)路徑而不參考當前頁面?

public static void PermanentRedirect(string url, HttpResponse response, bool endResponse) 
{ 
    url = //resolve url here. how? 

    response.Status = "301 Moved Permanently"; 
    response.AddHeader("Location", url); 

    if (endResponse) response.End(); 
} 

我怎樣才能解決這個網址,而不必通過當前頁面可以訪問Page.ResolveUrl?請注意,我可以通過更改方法簽名,但我不想因爲我認爲這會導致API負擔過重。

我有這幾個重載,所以我期望的用法是:

WebUtility.PermanentRedirect("~/somewhere/somepage.aspx") 
+0

這種情況下*'〜〜是什麼意思? (相對於什麼?我相信這兩個參數的URI構造函數會按預期的方式處理它)。如果不能以其他方式獲取頁面,則可以直接從HttpContext訪問該頁面。 – 2012-05-01 21:17:41

+0

'〜'是映射到Web應用程序根目錄的普通Web應用程序根運算符。關於Uri構造函數,你是指'新的Uri(字符串uriString,bool dontEscape)'?這是貶值,我不知道如果其他將適用。 – Jeff

回答

4

我相信你可以使用HttpRuntime.AppDomainAppVirtualPath作爲直接替代波浪。

你也可以使用VirtualPathUtility.ToAbsolute,但它不喜歡查詢字符串 - 所以你必須解析它們(或者,最好是使用UriBuilder)。

哦 - 和離題,但恕我直言,關閉HttpResponse擴展方法會使語法更容易一些。

+0

擴展方法是一個不錯的主意。謝謝你的提示。 – Jeff

1

您可以通過HttpContext.Handler獲取當前頁面實例:

var page = HttpContext.Current.Handler as Page; 
if (page != null) 
{ 
    // Use page instance, f.e. page.Request.Url; 
} 

順便說一句,你不需要傳遞HttpResponse或者:

HttpResponse response = HttpContext.Current.Response; 

http://msdn.microsoft.com/en-us/library/system.web.httpcontext.response.aspx

+0

謝謝蒂姆。我應該更清楚。我想避免完全引用該頁面。你認爲我執行這個約束是不合理的嗎?這樣做似乎很脆弱。 – Jeff

+1

@Jeff:你爲什麼想不引用當前頁面的url?當然,如果它在非web項目中被調用,它就很脆弱。但事實並非如此。 –

+0

在我看來,應該有辦法做到這一點,而不需要引用'HttpContext.Current.Handler'。需要引用這個頁面會引入一個依賴,這會使單元測試等非標準場景中的事情變得複雜。 – Jeff

2

This method should work

url = VirtualPathUtiliy.ToAbsolute(url); 
+0

+1我只明白OP的要求。他只是想解決這個網址。 –

+0

@StriplingWarrior是的。這正是我想要做的。謝謝。 – Jeff

相關問題