我有一个 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);
}
回到网页上的客户端 JavaScript,在错误回调函数上,我显示我的错误:
function GetInputErrorCallback(error)
{
$get('input_error_msg_div').innerHTML = error.get_message();
}
这很好用,当我的 Web 方法返回(一个字符串)时,它总是看起来很完美。但是,如果我抛出的异常中的一条错误消息包含特殊字符,则它在浏览器中显示不正确。例如,如果错误消息包含以下内容:
该输入无效! (那里有一个 ASCII #146)
它显示这个:
该输入无效!
或者:
你喜欢 Hüsker Dü 吗?(ASCII #252)
变成:
你喜欢 Hüsker Dü 吗?
错误消息的内容来自采用 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" />
我还有一个 HTTP 模块来设置 L10n 参数:
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 方法中抛出异常时,其消息中的特殊字符是不正确的。我怎样才能解决这个问题?