1

私は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)

になる:

あなたはHüskerDüが好きですか?

エラーメッセージの内容は、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メソッドから例外をスローすると、メッセージ内の特殊文字が正しくありません。どうすればこれを修正できますか?

4

1 に答える 1

1

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

あなたが見ているマングリングは、utf-8としてエンコードされたテキストが8ビットエンコーディングを使用して解析されるときです(つまり、あなたの場合、iso-8859-1などの8ビットデコーダーを使用してutf-8バイトストリームがデコードされます) /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 モジュールとそれが必要な理由を完全には理解していないため、状況は私が考えるよりも複雑である可能性があります。

于 2008-09-15T14:41:42.860 に答える