質問

Web サービス (ASMX) があり、その中に、何らかの作業を実行し、入力が無効な場合に例外をスローする Web メソッドがあります。

[ScriptMethod]
[WebMethod]
public string MyWebMethod(string input)
{
    string l_returnVal;

    if (!ValidInput(input))
    {
        string l_errMsg = System.Web.HttpUtility.HtmlEncode(GetErrorMessage());
        throw new Exception(l_errMsg);
    }

    // some work gets done...

    return System.Web.HttpUtility.HtmlEncode(l_returnVal);
} 

Web ページのクライアント側 JavaScript に戻り、エラー コールバック関数でエラーを表示します。

function GetInputErrorCallback(error)
{
    $get('input_error_msg_div').innerHTML = error.get_message();
}

これはうまく機能し、Web メソッドが (文字列) を返すときは常に完璧に見えます。ただし、スローされた例外のエラー メッセージの 1 つに特殊文字が含まれている場合、ブラウザーでは正しく表示されません。たとえば、エラー メッセージに次の内容が含まれていたとします。

その入力は無効です! (それは ASCII #146 です)

これは次のように表示されます。

その入力は無効です。

または:

ハスカー・デューは好きですか? (ASCII # 252)

次のようになります:

ヒュスカー・デュが好きですか?

エラー メッセージの内容は、UTF-8 エンコーディングの XML ファイルから取得されます。

<?xml version="1.0" encoding="UTF-8"?>
<ErrorMessages>
   <Message id="invalid_input">Your input isn’t valid!</Message>
   .
   .
   .
</ErrorMessages>

ページのエンコーディングに関する限り、私の Web.config には次のようにあります。

<globalization enableClientBasedCulture="true" fileEncoding="utf-8" />

L10n パラメータを設定するための HTTP モジュールもあります。

Thread.CurrentThread.CurrentUICulture = m_selectedCulture;
Encoding l_Enc = Encoding.GetEncoding(m_selectedCulture.TextInfo.ANSICodePage);
HttpContext.Current.Response.ContentEncoding = l_Enc;
HttpContext.Current.Request.ContentEncoding = l_Enc;

このHTTPモジュールを無効にしてみましたが、結果は同じでした。

Web サービスによって返される値 (l_errMsg 変数内) は、VS デバッガーでは問題なく表示されます。クライアント スクリプトが保持すると、正しく表示されなくなります。Firebug を使用して応答を確認しましたが、特殊文字も壊れています。したがって、Web メソッドから返される文字列が、たとえ特殊文字が含まれていたとしても正常に見えるのは、非常に奇妙です。それでも、Web メソッドから例外をスローすると、そのメッセージ内の特殊文字が正しくありません。これを修正するにはどうすればよいですか?

役に立ちましたか?

解決

「responseEncoding」ではなく、「fileEncoding」を設定することが本当に必要ですか?fileEncoding を設定すると、エンコーディングを自動的に決定できない場合に、Web サーバーがディスクから物理 .asmx/.aspx ファイルを読み取る方法が決まります。したがって、これを「utf-8」に設定すると、すべての .asmx/.aspx ファイルを utf-8 で保存する必要があります。関係ないと思うけど。

あなたが見ているマングルは、utf-8 としてエンコードされたテキストが 8 ビット エンコードを使用して解析されるときに発生します (つまり、utf-8 バイトストリームは、8 ビット デコーダ (この場合は iso-8859-1/Windows-1252 など) を使用してデコードされます。したがって、例外を throw() する前に実行している HtmlEncode() が、意図した出力エンコーディングに関して間違っている可能性があります。では、エラー メッセージを HtmlEncode() しないとどうなるでしょうか?

(技術的には、「ASCII # 252」は完全に正しくありません。ASCII には 128 文字があります。使用するアポストロフィは、この場合、iso-8859-1/Windows-1252 などの 8 ビット エンコーディングから来ています。)

その HTTP モジュールを正しく無効にしましたか?この行が問題の原因になっている可能性があります。

HttpContext.Current.Response.ContentEncoding = l_Enc;

...出力エンコーディングを 8 ビット エンコーディング (ANSI コード ページと同等) に設定している可能性が高いためです。

できるだけ多くのカルチャをサポートするには、応答エンコーディングを utf-8 に設定する必要があります。 これはブラウザーで最もサポートされている Unicode 形式であり (あえて言えば、最近のブラウザーはすべてサポートしています)、Unicode はローカル エンコーディングに代わる唯一の形式です。とはいえ、使用している HTTP モジュールとそれが必要な理由を完全には理解していないため、状況は私が思っているよりも複雑である可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top