1

URLエンコードを多用するウェブストアを構築しています。

私のデータベースには、リンクの生成に使用する部門とカテゴリのリストがあります。もちろん、これらは送信前にURLエンコードされます。

いくつかの典型的なリンクは...
/
MySite/Store/Countertop+Equipment/Can+Openers.aspx/MySite/Store/Dinnerware.aspx /MySite/Store/Kitchen/Pastry%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);
}

私は本当にあなたの助けに感謝します!

4

4 に答える 4

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

これは、URLを取得する方法を示しています:
/MySite/YourPage.aspx?category1= Store&category2=Kitchen&category3=Pastry%2f+Decorating
from:
/MySite/Store/Kitchen/Pastry%2f+Decorating.aspx

さらに、UrlRewriteの代わりに ルーティングを使用することを検討してください。

乾杯、
ドミトリ。

于 2009-08-14T00:42:47.283 に答える
1

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

于 2009-08-13T23:32:16.177 に答える
0

解析する前にURLをUrlEncodeすることができます。または、さらに良いことに、URLをデータベースにエンコードしないでください。HyperLinkコントロールを使用する場合は、それらをエンコードする必要もありません。

于 2009-08-14T01:18:53.470 に答える
0

.Netが要求を処理する前に、IISで問題が発生していることが判明しました。これは行き止まりのようです。

追加の警告は、IISテストサーバー(XP)が、エンコードされたアンペアスタンドを含む要求をセキュリティリスクとして拒否しており、レジストリの編集以外の方法で協力するように説得できなかったことです。これがすべてのバージョンに当てはまるかどうかはわかりませんが、サーバー変数を取得できる場合でも、これは別の戦術を使用するもう1つの理由のようです。

これが受け入れられた解決策のフォローアップ質問です-

ASP.NetURLエンコード

于 2009-08-25T19:25:27.800 に答える