SimpleIsBest.NET

유경상의 닷넷 블로그
이 글은 오래된 전에 작성된 글입니다. 따라서 최신 버전의 기술에 알맞지 않거나 오류를 유발할 수 있습니다. 저자는 이 글에 대한 질문을 받지 않을 것입니다. 하지만 이 글이 리뉴얼 되면 이 글에 대한 질문을 하거나 토론을 할 수도 있습니다.

안녕하세요... 정말 오랜만의 포스트군요. 원래 게으른데다 WCF 도서 집필, 회사 일도 많아서 정신이 없었답니다. 사이트에 너무 신경을 안 쓰는 거 아니냐 라고 생각하실지 모르지만... 맞습니다. T_T

그래도 매일 들어와 포스트에 대한 피드백 답변과 가끔 올라오는 질문들에 대해 "여긴 Q/A 게시판이 아닙니다"라는 싸가지 없는 글들을 남기곤 했답니다. 항상 좋은 내용을 독자 분들께 남기려고 고민하고 아이디어를 생각하지만 절대적인 시간 부족으로 "생각"으로만 끝나는 경우가 많네요.

Fiddler Tip in Capturing Web Service Message

"오호라... 간만에 글을 쓴다 이거지? 이젠 시간이 좀 되나 보지? "

이렇게 생각하는 독자가 있을지 모르겠다. 미안하게도 여전히 필자는 시간이 없다. 하지만 이렇게 사이트를 방치하다가는 손님 다 떨어질 것 같은 위기감에 봉착한 필자, 가벼운 팁 하나로 글 하나 날로 먹어보고자 글을 써 본다.

About Fiddler

Fiddler는 웹 개발자들에게 필수적인 디버깅 도구이다. 간편하고 손쉬운 설치와 사용방법도 매력적이지만 누구(?)나 무료로 다운로드 받아 사용할 수 있기 때문이다. 이런걸 만들어 나눠 주는 사람은 어떤 사람인지 정말 궁금하지 않은가?

http://www.fiddlertool.com

Fiddler에 대해 아직 모른다면 숏 잡고 2-30초 정도 반성의 시간을 가진 다음에 즉시 이 도구를 다운로드 받아 사용해 보길 권하는 바이다. 웹 어플리케이션과 HTTP 그리고 웹 서비스에 또 다른 눈을 뜨게 될 것이다. 아는 사람은 다 아는 유명하고 유용한 도구이기 때문에 구차하게 여기서 Fiddler를 어떻게 사용하는 지에 대해서는 언급하지 않겠다. 현재 Fiddler의 최신 버전은 2.x 이며 다양한 Add-in을 사용하여 더욱 더 편리하고 강력하게 HTTP 메시지들을 캡처 할 수 있다(화면2).

Fiddler Scrren Shot
화면1. Syntax Highlight 애드온을 사용한 Fiddler 2.x 버전

Capturing Web Service Call

Fiddler를 활용하는 방법은 대단히 다양하지만 오늘 관심을 가질 부분은 웹 서비스 호출을 캡처 하여 SOAP(Simple Object Access Protocol) 메시지를 살펴본다던가 웹 서비스 디버깅을 하는 경우이다. 쉽게 말하면 ASP.NET Web Service 혹은 WCF(Windows Communication Foundation) 호출에 문제가 있는 경우 이것을 살펴볼 때 유용하다는 말이 되겠다. 그런데... Fiddler를 통해 웹 서비스 호출을 캡처 할 때 가끔 클라이언트 프로그램이 다음과 같은 예외를 작렬하는 경우가 생기곤 한다.

System.Net.WebException: 기본 연결이 닫혔습니다. 보내기에서 예기치 않은 오류가 발생했습니다. ---> System.IO.IOException: 전송 연결 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다 ---> System.Net.Sockets.SocketException: 현재 연결은 사용자의 호스트 시스템의 소프트웨어의 의해 중단되었습니다.

이 예외가 발생하는 이유는 이렇다. HTTP는 TCP를 하부 트랜스포트(transport) 프로토콜로 사용함에도 불구하고 그 특성 상 Connection-less 프로토콜이기 때문이다. 즉, 매 HTTP Request/Response 마다 TCP 연결을 맺고 끊거나(HTTP 1.0), TCP 연결을 유지하는 것을 서버와 클라이언트가 협상할 수도 있지만 언제든지 TCP 연결은 끊길 수 있다(HTTP 1.1)는 것이다. 서버에 의해 TCP 연결이 강제로 끊기는 경우 닷넷 HttpWebRequest 클래스(웹 서비스와 WCF가 내부적으로 사용한다)가 이와 같은 예외를 유발하곤 한다. 특히, Fiddler로 웹 서비스 호출을 캡처 할 때 이런 예외가 자주 발생하는데, Fiddler가 클라이언트와 Fiddler 와의 TCP 연결을 끊어버리기 때문이다.

기본적으로 HTTP 클라이언트는 이렇게 TCP 연결이 서버에 의해 끊기는 상황에 대처하는 것이 가장 좋지만 Fiddler를 사용하지 않으면 전혀 문제가 없는 경우가 대부분이므로 굳이 복잡한 코드를 추가적으로 구사하지 않는 것이 일반적이라 할 수 있겠다.

Using Custom Rule in Fiddler

Fiddler는 매우 유연한 도구이다. 다양한 애드인을 개발할 수 있을 뿐만 아니라 HTTP 메시지를 캡처 하거나 필터링 하는 작업에 자신만의 규칙을 자바 스크립트를 통해 구현할 수도 있다. 앞서 언급한 웹 서비스 캡처 시에 발생하는 연결 끊김 문제를 해결하는 방법은 Fiddler의 커스텀 규칙을 약간 수정하면 해결이 가능하다. 이 방법은 Fiddler의 홈페이지(http://www.fiddlertool.com)에서  Known Issue 페이지를 살펴보면 된다.

뭐 링크 알려줬으니 여기서 블로그를 끝내는 것도 나쁘지 않겠지만... 잉글리쉬 프러블럼이 있거나 필자보다 더 심한 귀차니즘에 쩔어 사는 독자들을 위해 여기서 다시 설명하도록 하겠다. 먼저 화면2와 같이 Fiddler의 규칙 에디터 메뉴를 선택하자.

Fiddler Rule Menu
화면2. Fiddler의 Customize Rules 메뉴

그러면 Notepad 혹은 Fiddler Rule Editor가 구동될 것이다. 이 Rule은 Fiddler가 HTTP 메시지를 캡처 할 때 사용하는 다양한 규칙으로써 JScript.NET 코드이다. 이 코드에서 OnBeforeResponse 메쏘드를 눈에 불을 켜고 찾자. 쉽게 찾을 수 있을 것이다. 이 메쏘드의 맨 끝을 보면 몇 줄의 코드가 주석(comment)에 의해 막혀 있을 것이다. 이 코드의 주석을 살포시 풀어주자. 다음과 같이 말이다.

// Uncomment to reduce incidence of "unexpected socket closure" exceptions in .NET code.
// Note that you really should also fix your .NET code to gracefully handle unexpected connection closure.
//
if ((oSession.responseCode != 401) && (oSession.responseCode != 407)){
oSession.oResponse["Connection"] = "close";
}

리스트1. 수정해야 할 Fiddler의 Rule 코드

수정을 했으면 저장을 하고 에디터를 닫는다. 좀 허무하지만 이게 전부이다. 이렇게 수정하고 나면 이제 웹 서비스 호출을 Fiddler가 캡처 하는 상황에서도 "기본 연결이 닫혔습니다(The underline connection was closed)" 라는 예외가 발생하지 않을 것이다.

필자도 이 방법을 최근에 알게 되어 매우 유용하게 써먹고 있다. Fiddler를 사용하는 독자들도 이 방법을 통해 웹 서비스 호출을 캡처 할 때 발생할 수 있는 문제들을 해결하기 바란다.



Comments (read-only)
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 웹지니 / 9/13/2007 6:14:00 PM
힘든 와중에 간만에 올려주신 반가운 포스트 잘 봤습니다.
모쪼록 파이팅 하셔서 좋은 책 써주세요
제가 반드시 구입하도록 하겠습니다. ^^
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / ness09 / 9/13/2007 7:01:00 PM
정말 간만에 포스팅하셨네요. ㅎㅎ
저는 일전에 IEInspector Http Analizer 설치해 놓았더니, 요즘 그 녀석만 사용하게 되는데요..
저도 파이팅 한방 날려드리고 갑니다~~ ^^
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 땡초 / 9/13/2007 9:58:00 PM
드뎌 가뭄에 단비가 내린듯 합니다.
언제가 포스팅이 올라오면 너무 신선합니다 ( 내머리엔 먼지만 가득해서 ㅡㅡ )
감사합니다^^
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 눈꽃천사 / 9/14/2007 1:08:00 AM
'Q/A 게시판은 아닙니다.' 라는 소린 듣고 싶진 않지만 궁금한 점이 있어서...
fiddler 를 사용해서 https 를 packet capture 를 할 때, 안 잡히는 경우가 자주 있었습니다.
fiddler 까보면, https 에 대한 처리는 있는 것 같던데, 내공이 부족하여 fiddler 로는 해결하지 못했습니다.
대신에, HttpWatch(http://www.httpwatch.com) 를 사용하여 해결은 했습니다.
또한, fiddler 자체에 proxy 가 attach 되어 작동해서인지, IE 옵션에서 proxy 체크를 설정, 해제를 반복하면서 사용하는 불편한 점이 있었습니다.
그리고, ActiveX 가 있는 사이트인 경우엔, Response Body 가 fiddler 에선 아무것도 없이 보일 때가 있는데, hex edit 에선 실제로 해당 Response Body가 존재하고,
아무튼, 제가 알지 못하는 버그인지, 미숙함이 뭍어 있는 fiddler 입니다. ^^;
기회가 되신다면, HttpWatch에 대한 강좌도 기대해보겠습니다.
바쁘신 와중에 좋은 글 써주셔서 감사합니다.
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 블로그쥔장 / 9/14/2007 1:43:00 PM
이런 성원 덕에 제가 사이트를 못내린다는...
정말 감사합니다...

눈꽃천사//SSL은 암호화 되어 있기 때문에 Fiddler가 내용을 캡처 한다할지라도 볼 수 없죠.
그리고 SSL은 80이 아닌 별도 포트를 사용하기 때문에 80포트를 캡처하는 Fiddler는
SSL 연결하는 Request만 캡처되는 것으로 알고 있습니다.
내용을 못 읽더라도 SSL 연결을 보시려면 TcpTrace 같은 보다 저수준의 TCP 캡처
프로그램을 사용해 보시는 것도 좋습니다.
HttpWatch는 저도 한번도 사용해 보지 않은지라...
(게다가 플러그 인류의 유틸은 그닥 선호하지 않아서요... ^^)
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 신동열 / 9/18/2007 12:56:00 PM
감사합니다. 안그래도 이거 때문에 디버깅시 고생하고 있는데...
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 이경원 / 9/20/2007 5:15:00 PM
잘 봤습니당.^^ㅋㅋ..요즘 자바로 웹개발하는데 이거 함 써바야겠네요^^

추석 연휴 즐겁게 보내세요..
#햐~~~ 역시 맞군요. / 스티플의추억 / 10/2/2007 5:14:00 PM
한달전에 웹서비스로 작은 파일 전송 서비스를 작성 도중 예기치 않게 커넥션이 끊기는 걸 경험했습니다.

반나절 정도 삽질 후에 대략 fiddler 와 관련이 있다는 결론을 내리고 접었었죠.

혹시나 했더니만 역시나로군요.

해결책 까지 알려주셔서 감사합니다.
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / Mih-度 / 10/11/2007 1:13:00 PM
써보니까 편리하네용...
숏잡고 반성중...ㅜㅜ
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 민정호 / 10/18/2007 2:51:00 PM
써보니깐 편리하고 좋네요...항상 좋은 포스트 감사합니다...

숏잡고 반성중..ㅜㅜ(이 말 친구들끼리 진짜 많이 쓰는말인데...크게 한번 웃었습니다...^^)
#유용한 정보 감솨감솨~ / 가이아 / 10/24/2007 10:09:00 PM
잘읽고 갑니다. 오랜만에 글을 올리셨네욧~ 굳럭요~
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 손님 / 6/10/2009 11:36:00 AM
또한, fiddler 자체에 proxy 가 attach 되어 작동해서인지, IE 옵션에서 proxy 체크를 설정, 해제를 반복하면서 사용하는 불편한 점이 있었습니다.
..>Cooxie라는 프로그램을 사용하시면 편리하게 와따리 가따리 하실 수 있으실 거 같습니다 ^^
#re: Fiddler를 이용한 웹 서비스 호출 캡처 관련 팁 / 조조 / 4/30/2010 4:56:00 PM
저도 가끔 이런 문제가 생길때...
무한한 귀차니즘으로 '아 다르게 찾음 되지' 하고 걍 넘겼는데...
좋은 팁을 주셨군요 ㄳㄳ