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