프로그래밍/C#

[C#] WebClient 타임아웃 설정

ss-pro 2022. 12. 15. 23:26
반응형

웹서비스사용시 WebClient를 사용하여 POST요청을 하여 서버에 응답 받을 수 있습니다. 이때 WebClient의 경우 TimeOut속성이 없기때문에 타임아웃을 사용하려면 상속을 받아서 처리해야합니다. 

1. WebClientTester.cs소스파일 
WebClient대신에 MyWebClient클래스를 호출합니다. WebClient는 TimeOut값이 없어서 MyWebClient 클래스에 타임아웃값을 설정 할 수 있게 WebClient를 상속받아서 TimeOut처리부를 구현합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
 
namespace WebClientTester
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "http://127.0.0.1:44358/api/TodoItems";
            string data = "{\"name\": \"walk dog\",\"isComplete\": true}";
             
            MyWebClient webClient = new MyWebClient(5000);
            webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
            webClient.Encoding = UTF8Encoding.UTF8;
 
            //UploadString호출시 MyWebClient.GetWebRequest메소드에서 타임아웃시간까지
//응답이 없으면 예외발생
            string result = webClient.UploadString(url, data);
        }
    }
}


2. MyWebClient.cs소스파일 
WebClient클래스를 상속을 받은 후 GetWebRequest메소드 호출의 경우도 override하여 TimeOut(밀리세컨드)값을 설정합니다. 설정된 타임아웃이 지나면 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
 
namespace WebClientTester
{
    class MyWebClient : WebClient
    {
        int mTimeOut;
 
        public MyWebClient(int timeOut)
        {
            mTimeOut = timeOut;
        }
 
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            request.Timeout = mTimeOut;
            return request;
        }
    }
}



MSDN홈페이지에서 WebClient를 찾아보면 새개발에는 가능하면 사용하지 않는게 좋다고 하며 대신에 HttpClient클래스를 사용하는게 좋다고 하니 참고하시기 바랍니다.

https://learn.microsoft.com/ko-kr/dotnet/api/system.net.webclient?view=net-7.0