2014-06-13 4 views
2

응용 프로그램이 REST 서비스와 통신 중입니다. Fiddler는 Apps 응답으로 제공되는 완전한 XML 응답을 보여줍니다. 앱이 프랑스 령 폴리네시아에 있고 NZ의 동일한 사본이 작동하므로 주요 용의자가 인코딩을 보였으 나이를 확인하고 빈 손으로 나왔습니다.HTTPWebResponse 응답 문자열이 잘림

스트림 리더에서 출력 문자열 (UTF8 인코딩)을 보면 잘린 부분을 볼 수 있습니다. 그것은 무해한 xml 조각에 있습니다. XmlDocument 개체의 다운 스트림 오류로 인해 XML 문서 개체에 문자열을로드하는 동안 예기치 않은 파일 끝에 오류가 발생했다고합니다.

절사 점
NS6이다 : STS-KRN NS6의 일부 > 1 &

: STS-KRN > 1 </NS6 : STS-KRN > <

가 어느 하나 응답 문자열이나 우리가 점검해야하는 다른 매개 변수의 크기 제한. 나는 모두 아이디어가 부족합니다. 요청시 제공되는 코드.

Stream streamResponse = response.GetResponseStream(); 
StringBuilder sb = new StringBuilder(); 

Encoding encode = Encoding.GetEncoding("utf-8"); 
if (streamResponse != null) 
{ 
    StreamReader readStream = new StreamReader(streamResponse, encode); 
    while (readStream.Peek() >= 0) 
    { 
     sb.Append((char)readStream.Read()); 
    } 
    streamResponse.Close(); 
} 
+0

"감사 노트"/ 서명을 샘플 코드로 바꾸십시오. 당신이 잘못 읽었거나 잘못된 인코딩을 사용했을 가능성이 있습니다. 또한 게시물을 편집하는 동안 샘플 데이터도 코드로 포맷해야합니다. –

+0

Fiddler에서 실제 바이트를 봅니다. 인코딩은 Utf8이 아니며 "ns6 : sts-krn> 1

+0

동일한 REST 엔진과 동일한 앱이 NZ에 설치됩니다. 즉 폐쇄 된 시스템이다. NZ에서는 동일한 테스트 트랜잭션이 동일한 문자열을 생성하며 코드에 의해 잘리지 않습니다. 인코딩은 확실히 응답 헤더에서 utf-8입니다.> xml version = "1.0"encoding = "UTF-8"standalone = "yes". FP의 Fiddler는 문제없이 XML 모드에서 응답을 볼 수 있습니다. FP에서 우리 사람은 16 진수 레벨에서 피 들러 응답에 들어가서이 지역에 가짜 문자가 없다는 것을 확인했습니다. –

답변

1

당신은 using 블록을 사용해야합니다

using (WebResponse response = request.GetResponse()) 
{ 
    using (Stream streamResponse = response.GetResponseStream()) 
    { 
     StringBuilder sb = new StringBuilder(); 

     if (streamResponse != null) 
     { 
      using (StreamReader readStream = new StreamReader(streamResponse, Encoding.UTF8)) 
      { 
       sb.Append(readStream.ReadToEnd()); 
      } 
     } 
    } 
} 

이 보장됩니다 WebResponse, StreamStreamReader 모든 관계없이 예외가 있는지 여부, 청소 얻을.


나에 대한 using 블록이 생각하는 주도 추론 :

일부 작업이 완료되지 않았습니다
  1. 작업이 아니었다, 그래서 만약 예외를 숨기는 어떤 시도/catch 블록이 없었다
  2. 예외로 인해 완료되었으므로 그 사실을 알 수 있습니다.
  3. using 블록

결론에없는 IDisposable 구현하는 객체가 있었다 : 개체를 폐기하면 작업을 완료하게됩니다 있는지 확인하기 위해 using 블록을 구현하려고합니다.

추론은 실제로 매우 일반적이기 때문에이 내용을 추가했습니다. 동일한 추론은 "내 메일 메시지가 2 분 동안 전송되지 않습니다"에 대해 작동합니다. 이 경우 완료되지 않은 작업은 "전자 메일 보내기"이고 인스턴스는 SmtpClientMailMessage 개체입니다.

+0

내 코드와 비교하면 우아합니다. FP가 내일 사용할 수있을 때까지 차이가 ​​있는지 알 수 없습니다. –

+0

그것은 그것을 고쳤다. 감사. –

+0

왜이 문제가 해결 되었습니까 (일부 응답 이었습니까, 응답이 없거나 응답이 없습니다)? – usr

1

이 될 것이라고 할 수있는 쉬운 방법 : 읽고 정확히 볼 수 있도록

string responseString; 
using (StreamReader readStream = new StreamReader(streamResponse, encode)) 
{ 
    responseString = readStream.ReadToEnd(); 
} 

가 디버깅을 위해 내가 파일에 해당 응답 스트림을 작성 건의 할 것입니다. 또한 단일 바이트 인코딩 (예 : ISO-8859-1)을 사용하여 데이터를 읽고 파일에 쓸 수도 있습니다.

다른 텍스트 인코딩이 사용되는지 확인하려면 response.ContentType 속성을 확인해야합니다.

+0

응답을 추가했습니다 .ContentType이 'text/plain'을 반환합니다. –