BLOG ESPERANCA

[C#] WebClient에 timeout을 사용하는 방법 본문

Program/C / C++ / C#

[C#] WebClient에 timeout을 사용하는 방법

yobuce 2010. 9. 16. 15:10

오랫만에 아주 간단하지만 편리한 Tip을 한가지 소개합니다.

C#으로 네트워크 통신을 하려면, System.Net 네임스페이스 안에 속한 WebClient 클래스는 거의 필수라고 해도 과언이 아닙니다.

사용법도 아주 간단합니다.
예를 들어 POST  방식으로 웹서버에 request를 던지고, 그 결과(UTF8)를 받는 부분이 필요하다고 가정을 해봅시다.
아래와 같이 몇줄로 가능하지요.

           using (WebClient client = new WebClient())
           {
                NameValueCollection col = new NameValueCollection();
                col.Add("param1", "aaaa");
                col.Add("param2", "bbbb");

                byte[] byteResponse = client.UploadValues("http://someuri", col);
                string response = Encoding.UTF8.GetString(byteResponse);

                //.....
            }


때때로 WebRequest 라는 보다 low level의 클래스를 사용하기도 합니다.

            string postData = "param1=aaaa";
            postData += "&param2=bbbbb";
            byte[] data = Encoding.UTF8.GetBytes(postData);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://someuri");
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;
            Stream writeStream = request.GetRequestStream();
            writeStream.Write(data, 0, data.Length);
            writeStream.Close();


WebClient 클래스와 비교하면 꽤나 성가신 코드가 추가되어야 합니다.
Request의 Method, ContentType 을 써주어야 하고, RequestStream을 얻어와서 byte 배열을 직접 써야합니다.

그러나 WebRequest 클래스는 WebClient가 제공하지 않는 여러가지 기능을 제공합니다.
예를 들어 오늘 Tip의 주제인 Timeout 입니다.

WebClient에 Timeout 기능이 포함되어 있지 않아서 정말 단순한 기능인데도 WebRequest 클래스를 이용하는 경우를 더러 보았습니다.

그러나 WebClient 클래스를 조금만 살펴보면,
내부적으로 WebRequest를 사용하는 것을 알 수 있습니다.
바로 GetWebRequest라는 함수인데요.


그럼 WebClient 클래스를 상속받아서 이 함수를 override 하는 클래스를 만들어 보겠습니다.

class MyWebClient : WebClient
        {
            protected override WebRequest GetWebRequest(Uri address)
            {
                WebRequest request = base.GetWebRequest(address);
                request.Timeout = 1000;
                return request;
            }
        }


위의 Timeout에 들어가는 값은 밀리초 입니다.
그러니까 1000 ms = 1 sec가 되겠죠?

어떤가요?
WebClient를 사용하면서 Timeout도 되는 클래스..
쉽죠? ^^