9

まず、いくつかの簡単な背景... サード パーティ ベンダーとの統合の一環として、クエリ文字列に一連の情報を含む URL を受け取る C# .Net Web アプリケーションを使用しています。その URL は、MD5 ハッシュと共有秘密鍵で署名されています。基本的に、クエリ文字列を取得し、それらのハッシュを削除し、残りのクエリ文字列に対して独自のハッシュを実行し、提供されたものと一致することを確認します。

次の方法で Uri を取得しています...

Uri uriFromVendor = new Uri(Request.Url.ToString());
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark

私の問題は、ウムラウト (ü) などの特殊文字を含むクエリ文字列に起因しています。ベンダーは、RFC 2396 表現に基づいてハッシュを計算しています%FC。私のC#.Netアプリは、RFC 3986表現に基づいてハッシュを計算しています%C3%BC. 言うまでもなく、ハッシュが一致せず、エラーがスローされます。

不思議なことに、.Net の Uri クラスのドキュメントには、 RFC 3986 に設定されていない限り、RFC 2396 に従う必要があると書かれていますが、私のweb.configファイルには、この動作に必要であるというエントリがありません。

Uri コンストラクターが RFC 2396 規則を使用するように強制するにはどうすればよいですか?

それに失敗した場合、RFC 3986 オクテット ペアを RFC 2396 オクテットに変換する簡単な方法はありますか?

4

3 に答える 3

3

あなたの質問とは関係ありませんが、なぜここで新しい Uri を作成しているのですか? あなたはただすることができますstring queryFromVendor = Request.Url.Query.Substring(1); – アッティカ

+1 atticae! 作成していた余分な Uri を削除しようと戻ったところ、突然、文字列のウムラウトが UTF-16 ではなく UTF-8 としてエンコードされました。

最初は、これがうまくいくとは思いませんでした。どこかで、 を使用して URL を取得しようとしましたRequest.QueryStringが、これによりウムラウトが%ufffd� 文字として表示されていました。新鮮な視点を得るために、私は atticae の提案を試してみましたが、うまくいきました。

答えは、ここで読んだものと関係があると確信しています。

C# はすべての文字列で UTF-16 を使用し、ストリームやファイルを処理する際にエンコードするツールを使用して...

ASP.NET はデフォルトで UTF-8 を使用しており、それが適切な選択ではない時期を考えるのは困難です...

私の問題はここから生じました...

Uri uriFromVendor = new Uri(Request.Url.ToString());

uri を取得してRequest.Url別の uri を作成することで、C# 標準の UTF-16 としてエンコードされました。元の uri を使用することで、.Net 標準の UTF-8 のままになりました。

ご協力いただきありがとうございます。

于 2011-08-12T16:52:12.843 に答える
1

これはちょっとしたニシンなのだろうかと思います:

これは、FC がウムラウト付きの u の UTF16 表現であるためです。C2BC は UTF8 表現です。

ソース データを通常の .Net 文字列に変換する System.Text.Encoding メソッドの 1 つが役立つのではないかと思います。

この質問も興味深いかもしれません: rfc2396 URL のエンコードとデコード

于 2011-08-12T00:18:33.387 に答える
1

Uri コンストラクターの標準エンコーディングについてはわかりませんが、他のすべてが失敗した場合は、いつでも自分で URL をデコードし、好きなエンコーディングでエンコードできます。

HttpUtility -ClassにはUrlDecode()andUrlEncode()メソッドがあり、System.Text.Encodingを 2 番目のパラメーターとして指定できます。

例えば:

string decodedQueryString = HttpUtility.UrlDecode(Request.Url.Query.Substring(1));
string encodedQueryString = HttpUtility.UrlEncode(decodedQueryString, System.Text.Encoding.GetEncoding("utf-16"));
// calc hash here
于 2011-08-12T00:34:23.057 に答える