2

クエリ文字列がUrlEncodedであるか、ASP.NETでパーセント文字を使用している場合に、Requestオブジェクトから実際のクエリ文字列を取得するにはどうすればよいですか?

基本的に、次のようなURLがある場合Default.aspx?p=%b4、「%b4」が入力された文字列を取得するにはどうすればよいですか?

Request.QueryString["p"]印刷できない文字を返します。

Request.RawUrlDefault.aspx?p =%ufffd"を返します

Request.Url.AbsoluteUriDefault.aspx?p =%EF%BF%BDを返します

「%b4」を取り戻すにはどうすればよいですか?

4

4 に答える 4

4

私はこれをさらに掘り下げて、これの原因を知っていると信じています: HTTP クライアントが、適切に URL エンコードされていない URL をサーバーに送信しています。具体的には、URL に無効な文字があります。

再現するには、URL の最後に以下を IE8 に貼り付けます。default.aspx?p=´

(たとえばFiddlerを使用して) ネットワーク上を移動するバイトを調べると、実際の Hex B4 文字が URL でクライアントからサーバーに送信されていることがわかります。URL は 0x80 未満の文字コードに制限されているため、これは URL では無効な文字です (0x80 より大きい文字コードはパーセントでエスケープする必要があります)。

したがって、クライアントは無効な文字を渡し、サーバーは偽の文字を (正しく) Unicode 置換文字 (U+0FFD)の UTF-8 エンコーディングである %EF%BF%BD に置き換えています。ローカルエンコーディングに同等のものがない文字に遭遇したとき。

私の知る限り、これは IE のバグです。同じ URL を Firefox に入力すると、Firefox は URL を適切にエンコードします (' ではなく %b4 として)。また、知る限り、無効な文字をIEのアドレスバーに手動で貼り付けた場合にのみ問題が発生することに注意してください-同じ文字がリンクに存在する場合、IEはURLを適切にエンコードしているようです(少なくとも私がテストした場合)。

したがって、誰がこの偽の URL を送信しているのかを突き止め、URL を適切にエンコードするように指示する必要があります。

于 2009-10-28T16:52:05.887 に答える
1

Request.Querystring ["key"]を実行すると、Asp.netは自動的にURLデコードを行います。もう一度エンコードする必要があります。

HttpUtility.UrlEncode(Request.QueryString["p"])
于 2009-10-28T18:03:53.667 に答える
0
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]

RAW クエリ文字列を返します

于 2009-10-28T17:44:25.360 に答える