2008-09-15 4 views
1

웹 서비스 (ASMX)가 있고 그 중 일부는 작동하고 입력이 유효하지 않은 경우 예외를 throw하는 웹 메서드가 있습니다.ASP.NET WebService가 예외를 throw 할 때 횡설수설 문자를 반환합니다.

function GetInputErrorCallback(error) 
{ 
    $get('input_error_msg_div').innerHTML = error.get_message(); 
} 

이 위대한 작품을 때 내 웹 메소드가 리턴 (문자열) : 위로 웹 페이지에 클라이언트 측 자바 스크립트 오류 콜백 함수에

[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); 
} 

, 내 오류를 표시 , 그것은 항상 완벽 해 보입니다. 그러나 내 던져 예외에서 내 오류 메시지 중 하나가 특수 문자가 포함되어 있으면 브라우저에서 잘못 표시됩니다. 예를 들어, 오류 메시지에 다음 내용이 포함 된 경우 :

입력이 올바르지 않습니다!

그것은이 표시됩니다 (즉, 거기에 아스키 # 146의) :

입력 €의 ™의 t이 유효 ISNA는 그건

!

또는 :

는 허스커 두 좋아하세요? (ASCII 번호 252)

가된다 :

이 Hüsker Dü 좋아하세요?

<?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" /> 

오류 메시지의 내용은 UTF-8 인코딩으로 XML 파일에서 온다 내가 disablin을 시도했습니다

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; 

:

또한 L10N 매개 변수를 설정하기위한 HTTP 모듈이 이 HTTP 모듈은 결과가 동일합니다.

웹 서비스에서 반환 한 값 (l_errMsg 변수)은 VS 디버거에서 제대로 표시됩니다. 클라이언트 스크립트가 보류 된 후에는 잘못 표시됩니다. 나는 응답을보기 위해 방화 광을 사용했고 특수 문자도 거기에 엉망이되었다. 그래서 나는 꽤 이상한 내 웹 메서드에 의해 반환 된 문자열 괜찮아 보이는 경우에도 그들에 특별한 문자가 있습니다. 그러나 웹 메서드에서 예외를 throw하면 해당 메시지의 특수 문자가 올바르지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

1

"fileEncoding"을 "responseEncoding"이 아니라 원하는 것으로 설정 했습니까? fileEncoding을 설정하면 인코딩을 자동으로 확인할 수없는 경우 웹 서버가 실제 .asmx/.aspx 파일을 디스크에서 읽는 방법을 결정합니다. 따라서 이것을 "utf-8"로 설정하면 모든 .asmx/.aspx 파일을 utf-8에 저장해야합니다. 나는 비록 적절하다고 생각하지 않습니다.

utf-8로 인코딩 된 텍스트가 8 비트 인코딩을 사용하여 구문 분석되는 경우 (예 : utf-8 bytestream이 8 비트 디코더를 사용하여 디코딩 된 경우 (예 : iso) -8859-1/Windows-1252). 따라서 예외를 throw하기 전에 수행중인 HtmlEncode()가 의도 한 출력 인코딩에 대해 잘못되었을 가능성이 있습니다.오류 메시지를 HtmlEncode()하지 않으면 어떻게됩니까?

(기술적으로 "ASCII # 252"는 맞지 않습니다 : ASCII는 128 자이고, 사용하는 아포스트로피는 8 비트 인코딩 (예 : iso-8859-1/Windows- 1252.)

해당 HTTP 모듈을 올바르게 비활성화 하시겠습니까? 이 줄은 문제의 원인이 될 수있는 다음과 같습니다

HttpContext.Current.Response.ContentEncoding = l_Enc;

를 ... 그것은 가능성이 가장 높은 8 비트 인코딩 (ANSI 코드 페이지에 해당)에 출력 인코딩을 설정하는 것 때문이다.

가능한 한 많은 문화권을 지원하려면 utf-8로 응답 인코딩을 설정해야합니다. 이것은 브라우저에서 가장 많이 지원되는 유니 코드 형식입니다 (저는 현대의 모든 브라우저에서 지원함). 유니 코드는 로컬 인코딩의 유일한 대안입니다. 즉, 내가 사용하는 HTTP 모듈과 필요한 이유를 완전히 이해하지 못하기 때문에 생각보다 복잡 할 수 있습니다.

관련 문제