2013-10-09 1 views
2

XML 페이로드를 전달하는 수신 푸시 알림을 다루는 독립 실행 형 처리기 (.ASHX)를 가지고 있으며,이 XML을 구문 분석 한 다음 필요한 정보를 추출하고 처리합니다. 문제는 개발 환경이 너무 심하게 방화벽으로 연결되어 들어오는 알림에 대한 예외를 허용 할 수 없어 로컬로 테스트 할 수 없다는 것입니다.responseStream 및 StreamReader를 올바르게 처리하면 닫습니다.

테스트 환경에서 테스트 해본 결과 알림이 제대로 처리되고 있지만 임의 코드 검토 후 responseStreamsstreamReaders을 처리하는 방법에 문제가있는 것처럼 보입니다.

내 질문은이 리소스의 폐쇄를 처리하는 유효한 방법입니까, 아니면 잠재적으로 NullReferenceException이 발생할 수 있습니까?

using 문을 사용하여 해당 범위에서만 사용하도록해야합니까, 아니면이 코드로 충분합니까? 이러한 리소스를 다루는 표준적인 관행은 무엇입니까? 모든 스트림이 제대로 using 문 내부 예외가있는 경우에도 종료됩니다

string serverResponse = null; 
using (Stream responseStream = response.GetResponseStream()) 
{ 
    using (StreamReader reader = new StreamReader(responseStream)) 
    { 
     serverResponse = reader.ReadToEnd(); 
    } 
} 

이 방법 :

Stream responseStream = null; 
StreamReader reader = null; 
string serverResponse = null; 

try 
{ 
    responseStream = response.GetResponseStream(); 
    reader = new StreamReader(responseStream); 
    serverResponse = reader.ReadToEnd(); 
} 

finally 
{ 
    if (reader == null) 
    { 
     reader.Close(); 
    } 

    if (responseStream == null) 
    { 
     responseStream.Close(); 
    } 

    response.Close(); 
} 

답변

2

using 블록을 사용하는 것이 좋습니다.

+1

중첩 된 문장을 사용하면 문장이 '올바르게'스트림을 닫을 수 있지만 예외가 손실 될 수 있습니다. http://stackoverflow.com/questions/19238521/handling-exceptions-thrown-by-dispose-while-unwinding-nested-using-statement –

1
나는 코드 외에 다음 사용하도록 유혹 할 것이다

:

responseStream.Seek(0, SeekOrigin.Begin); 

using (StreamReader sr = new StreamReader(responseStream)) 
{ 
    message = sr.ReadToEnd(); 
} 

을하고 난 당신 responsestream 어떤 방식으로 실패 할 경우 어떤 '캐치', 예를 들어,에 넣어 거라고 그것은 다른 끝에서 일찌기 닫혔다, 등등에있는 불일치 etc. etc.가 있는가?

the CommunicationException Class

P.S.에서보세요 개인적으로 중첩 된 문을 사용하는 것은 좋지 않지만 사용해야하는 경우에는 AggregateExceptions를 살펴보십시오.

+0

입력하신 내용을 보내 주셔서 감사합니다. 둘 다 살펴 보겠습니다. 먼저 간단한 사용 및 구현에 대한 대답으로 대답하지만 훌륭한 답변입니다. 감사합니다. –

관련 문제