2009-08-13 13 views
1

我正在構建一個廣泛使用URL編碼的網絡商店。URL編碼在處理之前丟失 - ASP.net

我有一個部門的列表&我的數據庫中用於生成鏈接的類別。這些當然是在URL發送之前編碼的。

一些典型的鏈接是...
/MySite/Store/Countertop+Equipment/Can+Openers.aspx
/MySite/Store/Dinnerware.aspx /mysite的/存儲/廚房/糕點%2f + Decorating.aspx

在我的HTTPHandler中,我調用app.Request.Path來獲取當前路徑。此調用返回的字符串不再是URL編碼,這使我無法正確解析。 一旦URL編碼丟失
/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx成爲
/MySite/Store/Kitchen/Pastry/Decorating.aspx

這顯然打破了將URL轉換爲QueryString的方法。

任何人都知道如何解決這個問題?

這裏是我的HttpHandler的核心

public void Init(System.Web.HttpApplication app) 
{ 
    app.BeginRequest += new EventHandler(Application_BeginRequest); 
} 

private void Application_BeginRequest(object sender, EventArgs e) 
{ 
    System.Web.HttpApplication app = (System.Web.HttpApplication)sender; 

    string realUrl = GetRealUrl(app.Request.Path); 

    if (!String.IsNullOrEmpty(realUrl)) 
     app.Context.RewritePath(realUrl, false); 
} 

我真的很感謝你的幫助!

+1

無後續問題做什麼,我需要......看樣子,解碼可以在IIS水平發生之前,.net甚至可以接到請求。我有另一篇文章,其中「〜」不是用編碼/字符呈現正確的路徑,這似乎證實了這一點。 Grr ..我不明白URLEncoding的意義在於,如果服務器在我的URL到達應用程序之前就已經有了它的方式。 –

回答

0

事實證明,這個問題發生在IIS之前.Net甚至掌握了請求。看起來,這是一個死衚衕。

另外一個警告詞是我的IIS測試服務器(XP)拒絕包含編碼的amperstands作爲安全風險的請求,並且無法被說服與缺少註冊表編輯的任何東西配合。不知道這是否適用於所有版本,但即使可以檢索服務器變量,這似乎也是使用不同策略的另一個好理由。

這裏是對請求的方法或屬性接受解決方案 -

ASP.Net URL Encoding

1

嘗試請求對象上的AbsolutePath或PathAndQuery屬性。他們兩個都應該保持url編碼。

2

因爲它的OriginalString已經被解碼了,所以你不能使用Request.Url(包括Url..PathAndQuery,AbsolutePath等)。

所以沒有點都使用Request.Url,你可以嘗試用以下的發揮:

或者在最壞的情況下,你需要解析Url:

[Test] 
    public void RewriteProoveOfConcept() { 
     var path = @"/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx"; 
     var res = Regex.Replace(path, @"/(.+)/(.+)/(.+)/(.+)\.aspx", @"/$1/YourPage.aspx?category1=$2&category2=$3&category3=$4"); 
     Assert.AreEqual(@"/MySite/YourPage.aspx?category1=Store&category2=Kitchen&category3=Pastry%2f+Decorating", res); 
    } 

這表明h嗷嗷你可以得到的網址:
/MySite/YourPage.aspx?category1=Store &類別2 =廚房&類別3 =糕點%2F +裝飾
來自:
/mysite的/存儲/廚房/糕點%2F +裝飾。 aspx

另外考慮using Routing而不是UrlRewrite。

乾杯,
德米特里。

+0

我瀏覽了請求的整個屬性/方法樹,不幸的是問題似乎在上游甚至更遠,可能在IIS中。無論如何感謝您的詳細回覆,至少讓我在正確的軌道上檢查。 –

0

您可以在解析它之前UrlEncode URL。或者更好的是,保持URL的非編碼數據庫。如果您使用HyperLink控件,則甚至不需要對它們進行編碼。

+0

不幸的是,Url在解析之前再次進行編碼將無濟於事,因爲它將編碼所有斜線,無論它們是路徑的一部分還是文本的一部分。 –