ASP.NET WebService 반환 횡설수설에 문자를 던지는 경우는 예외
-
09-06-2019 - |
문제
나는 web 서비스(ASMX)및에서 그것은,웹 방법는 몇 가지 작업을 수행하고 예외가 발생한 경우 입지 유효합니다.
[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);
}
에 다시 클라이언트 측에서 자바스크립트는 웹 페이지에 오류가 콜백 함수,나는 나의 디스플레 오류가:
function GetInputErrorCallback(error)
{
$get('input_error_msg_div').innerHTML = error.get_message();
}
이 때 나 웹 방법을 반환(문자열),항상 완벽한 모습을 보여줍니다.그러나,하나의 오류 메시지에서 내 던져 예외에 포함되는 특별한 문자,그것의 잘못 표시됩니다.예를 들면,오류 메시지가 있었다 포함하는 다음과 같다:
는 입력 유효하지 않습니다! (는 ASCII#146 가)
그것이 표시됩니다:
는 입력 isn’t 새롭고 독특한 방법을 제공합니다.
또:
당신은 다음과 같 Hüsker Dü? ASCII(#252)
가:
당신은 다음과 같 Hüsker Dü?
콘텐츠의 오류 메시지에서 온 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 모듈을 설정하 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 모듈 하지만 결과는 동일합니다.
반환되는 값에 의하여 웹 서비스(에 l_errMsg 변수)보다 잘에 대 debugger.그것은 한 번만 클라이언트 스크립트의 파악,그것이 올바르게 표시되지 않습니다.나는 사용 방화를 보면 응답고 특별한 문자는 망가지에 있고,너무합니다.그래서 나는 그것을 찾을 예쁜 이상하는 문자열을 반환에 의해 나 웹 방법을 잘 보이도 있는 경우에 특별한 문자들.아직 때 나는 예외를 웹에서 방법,특수 문자 메시지가 잘못되었습니다.어떻게 이 문제를 해결할 수 있을까요?
해결책
당신은 확실 설정"fileEncoding"당신이 무엇을 원하지 않"responseEncoding"?설정 fileEncoding 는 방법을 결정하는 웹 서버를 읽으려고 물리적입니다.asmx/.aspx 디스크에서 파일을 때 그것을 결정할 수 없 인코딩 자동으로 합니다.그래서,설정에 이를"utf-8"의 의미를 저장해야 합니다 모두.asmx/.aspx 파일에 utf-8 입니다.나는 생각하지 않는 것은 타당하지만.
서 엉망으로 당신이 볼 때는 텍스트로 인코딩에 utf-8 분석을 사용하는 8 비트 인코딩(i.eutf-8 바이트 스트림을 해독을 사용하는 8 비트의 암호해독기와 같은,당신의 경우,iso-8859-1/Windows-1252).그래서 그것을 가능하 HtmlEncode()할을 하기 전에 던져()ing 예외에 대한 잘못된 출력을 인코딩이 있습니다.그래서 무엇이 일어나지 않는 경우 HtmlEncode()이 오류 메시지가?
(기술적으로,"ASCII#252"아마추;ASCII 에는 128 개의 문자;아포스트로피를 사용하이에서 오는 8 비트 인코딩 등에서,당신의 경우,iso-8859-1/Windows-1252.)
당신은 당신을 사용하는 HTTP 모듈을 올바르게?이 선을 보인 그것과 같은 문제의 원인일 수 있습니다:
HttpContext.Current.Response.ContentEncoding = l_Enc;
...때문에 그것은 가장 가능성 설정 출력을 인코딩하는 8 비트 인코딩(ANSI 코드 페이지에 해당).
을 지원하는 많은 문화 가능한 설정해야 합 응답이 인코딩에 utf-8 을 얻을 수 있습니다. 이것이 가장 지원되는 유니코드 형식으로 브라우저에서(I 습 모든 현대적인 브라우저 지원)고 유니코드는 유일한 대안을 로 인코딩.는 말했다,저는 완전히 이해할 수 없는 무엇 HTTP 모듈을 사용하고 당신이 그것을 필요로하는 이유는,그래서 상황보다 더욱 복잡할 수 있습 나는 생각한다.