2009-08-13 15 views
1

URLエンコーディングを広範囲に使用するWebストアを構築しています。処理前にURLのエンコーディングが失われる - ASP.net

私はリンクを生成するために私のデータベース内に部門&のカテゴリを持っています。これらはもちろん、送信前にURLエンコードされています。

いくつかの典型的なリンクがある...
/MySite/Store/Countertop+Equipment/Can+Openers.aspx
/MySite/Store/Dinnerware.aspx /個人用サイト/通販/キッチン/ペーストリー%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でもリクエストに手をつけています。私は "〜"がこれを確認するように思われるエンコードされた/文字で正しいパスをレンダリングしていない別の投稿を持っていました。私は、URLEncodingのポイントが、アプリケーションに到達する前にサーバーが自分のURLを持っているかどうかわかりません。 –

答えて

0

IISで問題が発生していますが、.Netはリクエストに手を加えています。これは死んでいるようです。

私のIISテストサーバー(XP)は、セキュリティ上のリスクとしてエンコードされたamperstandsを含む要求を拒否していたため、レジストリの編集が不十分なものと協力するよう説得することはできませんでした。これがすべてのバージョンで使用できるかどうかはわかりませんが、サーバー変数を取得できても、これは別の方法を使用するもう1つの理由です。ここで

はリクエストのメソッドやプロパティの受け入れ溶液 -

ASP.Net URL Encoding

1

Requestオブジェクトに対してAbsolutePathまたはPathAndQueryプロパティを試してください。どちらもURLエンコーディングを維持する必要があります。

2

OriginalStringが既にデコードされているため、Request.Url(Url..PathAndQuery、AbsolutePathなど)は使用できません。

だからまったくRequest.Urlを使用するためにはポイントがありませんし、次に再生しようとすることができます:

あるいは最悪のシナリオで

  • Request.AppRelativeCurrentExecutionFilePath
  • Request.CurrentExecutionFilePathます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を示します
    /個人用サイト/通販/キッチン/ペストリー%2F +デコレーション:
    から飾る
    /MySite/YourPage.aspx?category1=Store &カテゴリ2 =キッチン&カテゴリー3 =ペストリー%2F +:OWあなたはURLを得ることができます。 aspx

    さらに、UrlRewriteの代わりにusing Routingを検討してください。

    乾杯、
    ドミトリー。

+0

私はリクエストのプロパティ/メソッドツリー全体を調べましたが、残念ながらIISの上流に問題があるように見えます。とにかく、少なくともどこをチェックするのか、私にはっきりとした詳細な回答に感謝します。 –

0

URLを解析する前に、URLをUrlEncodeにすることができます。あるいは、URLにコード化されていないものをデータベースに保存しておく方がよいでしょう。 HyperLinkコントロールを使用する場合、エンコードする必要はありません。

+0

残念ながら、Urlはパースする前に再度エンコーディングしても、パスの一部であってもテキストの一部であっても、すべてのスラッシュをエンコードするため、解析に役立ちません。 –

関連する問題