我有一个web服务(ASMX),并且在其中有一个web方法,它执行一些工作并在输入无效时抛出异常。ASP.NET WebService在抛出异常时返回异常字符
[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在那里)
它显示了这一点:
该输入ISNA€™吨有效!
或者:
你喜欢哈斯克·杜?(ASCII#252)
变为:
你喜欢HüskerDü?
错误消息的内容来自于XML文件用UTF-8编码:
<?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模块设置本地化参数:
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;
我试过disablin g这个HTTP模块,但结果是一样的。
在VS调试器中,Web服务(在l_errMsg变量中)返回的值看起来很好。这只是一旦客户端脚本拥有,它显示不正确。我使用Firebug来查看响应,特殊字符也在那里发生了重大变化。所以我觉得很奇怪我的web方法返回的字符串看起来很好,即使它们中有特殊字符。然而,当我从Web方法抛出异常时,其消息中的特殊字符不正确。我怎样才能解决这个问题?