6

.NET ASMX Web サービスが、直接制御できないクライアントからの要求を受け入れています。次のようなリクエストを送信しています。

POST /Service.asmx HTTP/1.1
Connection: Keep-Alive
Pragma: no-cache
Content-Length: 1382
Content-Type: text/xml
Accept: text/xml
Host: localhost
User-Agent: Borland SOAP 1.1
SOAPAction: "http://domain.com/InsertRecords"

<?xml version="1.0"?>
<SOAP-ENV:Envelope... <v>ÄLMÅ BÄCK</v></SOAP-ENV:Envelope>

私の WebMethod では、文字列 ÄLMÅ BÄCK が ??LM?? にマンジされます。B??CK -- 典型的なエンコーディングの混乱。

私のテストでは、単に content-type ヘッダーを微調整すれば、すべてうまくいくことがわかりました。

Content-Type: text/xml; charset=utf-8

.NET が指定されていないときに utf-8 以外のエンコーディングを選択するのはなぜですか? また、この ASMX に UTF-8 エンコーディングを使用するように強制する方法はありますか?

4

2 に答える 2

4

Web サービス ハンドラーが呼び出される前に次のコードを実行すると、HTTP 要求が正しくデコードされます。

if (HttpContext.Current.Request.ContentType == "text/xml") {
    HttpContext.Current.Request.ContentType = "text/xml; charset=UTF-8";
}

これは少しハックに感じますが、私の状況ではうまくいくと思います。なぜこれが問題だったのか、そしてこれをうまくやってのけるためのより良い方法があるかどうかについての背景情報にまだ非常に興味があります(クライアントにエンコーディングについてより明確にする以外に)。

于 2012-04-19T03:39:43.193 に答える
1

IIS 7.5 には、これを支援する構成オプションがあります。(以前のバージョンがこれをサポートしているかどうかはわかりません。) 拡張 ASCII 文字セットの上位 5 文字を意味のある区切り文字として使用するシステムから要求を受け取る Web アプリケーションがある場合に、同様の問題がありました。これらは、IIS が着信要求に適用していたデコードによって変更されていました。この問題を解決するための IIS 構成オプションがいくつか見つかりました。


まず、IIS マネージャーで Web サイトを選択し、.NET グローバリゼーション設定を開きます。

IIS .NET グローバリゼーション設定


ファイル、リクエスト、レスポンス ヘッダー、およびレスポンスの予期されるエンコーディングの設定があります。数十のエンコーディング オプションから選択できます。

IIS でのエンコーディングの設定


この特定のサイトは、私が作成したプログラムからの要求のみを受け取ったため、これは私のシナリオでは完璧に機能しました。オーディエンスが不明な場合、ユーザーがリクエストを適切にエンコードすることを期待するだけです。(ただし、デフォルトのエンコーディングを使用してもそれは真実です...)

于 2013-10-14T20:48:57.183 に答える