2010-02-24 2 views
0

우리의 C# .net 소프트웨어는 계정과 상점을 다루는 온라인 앱에 연결됩니다. 이것은 HttpWebRequestHttpWebResponse을 사용하여 수행합니다. 제목에 예외가에서 온왜 System.FormatException가 발생합니까? 고객의 일부 컴퓨터에서 문자열이 유효한 부울로 인식되지 않았습니까?

이 상호 작용의 예를 들어, 하나 개의 영역은 다음과 같습니다

var request = HttpWebRequest.Create(onlineApp + string.Format("isvalid.ashx?username={0}&password={1}", HttpUtility.UrlEncode(username), HttpUtility.UrlEncode(password))) as HttpWebRequest; 
      request.Method = "GET"; 
      using (var response = request.GetResponse() as HttpWebResponse) 
      using (var ms = new MemoryStream()) 
      { 
       var responseStream = response.GetResponseStream(); 
       byte[] buffer = new byte[4096]; 
       int read; 
       do 
       { 
        read = responseStream.Read(buffer, 0, buffer.Length); 
        ms.Write(buffer, 0, read); 
       } while (read > 0); 
       ms.Position = 0; 
       return Convert.ToBoolean(Encoding.ASCII.GetString(ms.ToArray())); 
      } 

온라인 응용 프로그램은 응답 중 하나를 'true'또는 'false'. 우리의 모든 테스트에서 이러한 값 중 하나를 얻지 만, 두 고객 (수백 개 중)에 대해서는 예외가 발생합니다. System.FormatException: String was not recognized as a valid Boolean 응답이 무언가에 의해 왜곡되고있는 것처럼 들립니다. 웹 브라우저에서 온라인 앱으로 이동하도록 요청하면 올바른 응답을 볼 수 있습니다. 클라이언트는 일반적으로 프록시 네트워크를 통해 상당히 제한적이며 종종 프록시 서버 아래에 있지만 대개 프록시 세부 정보를 입력하거나 방화벽 예외를 추가하면 잘 처리됩니다. 서버에서 응답을 엉망으로 만들 수있는 것이 있습니까? 아니면 코드에 문제가 있습니까?

+0

이 경우 응답 헤더가 무엇인지 보여줄 수 있습니까? – feroze

답변

1

실제로 반환 결과가 다소 다를 수 있습니다.

당신이 거기에서 repsonse를 읽는 합리적으로 정교한 방법을하고있는 특별한 이유가 있습니까? 왜 : 그것은 일부 현지화 문제

bool myBool = false; 
Boolean.TryParse(Encoding.ASCII.GetString(ms.ToArray()), myBool); 
return myBool; 
+0

원래 코더에게 물어볼 것입니다. 내가 원래 그것을 보았을 때 나는 그것을 바꿀 필요가 없도록 일을하는 것처럼 보였다. 데이터를 가져 오는 데 사용 된 메서드가 실제로 구문 분석 할 수 있는지 여부에 영향을 미칩니 까? – Septih

+0

@Septh 아니, 아니. 단지 오류가 발생하기 쉽습니다. 데이터의 구성 요소 또는 수정 된 데이터 만 수신하는 연결과 관련된 문제 일 수 있습니다. 로깅을 추가하고 거기에서 이동합니다. –

1

우선주의하는 내가 확실히 뭔가를 사용하는 것입니까? 그것은 스와힐리어 버전의 'true'를 기대하며 혼란스러워하고 있습니다. 모든 언어가 같은 국가의 사이트입니까?

다른 사람들이 제안한대로 로깅을 추가하고보고있는 결과를 확인하십시오.

나도 몇 가지 추가 변경 사항 (코드 '냄새'문제, IMO)에도 불구하고 코드를 실키로 변경하는쪽으로 기울기를 기대합니다. 응답뿐만 아니라 스트림 판독기 주위에 using을 사용하십시오.

또한이 경우에는 as을 사용하는 것이 적절하지 않다고 생각합니다. 응답을 HttpWebResponse으로 전송할 수없는 경우 (확실하지는 않지만 그래도 그렇지만) response.GetResponseStream() 비트에서 NullRef 예외가 발생합니다.이 오류는 모호한 오류이며 원래 행 번호를 잃어 버렸습니다. (HttpWebResponse)request.GetResponse()을 사용하면보다 정확한 오류와 실제 오류의 정확한 줄 번호를 알 수 있습니다.

0

입니다 아니에요 :

string data; 

using(HttpWebResponse response = request.GetResponse() as HttpWebResponse){ 
    StreamReader str = new StreamReader(response.GetResponseStream()); 
    data = str.ReadToEnd(); 
    str.Close(); 
} 

string cleanResult = data.Trim().ToLower(); 

// log this 

return Convert.ToBoolean(cleanResult); 
관련 문제