How to check if System.Net.WebClient.DownloadData is downloading a binary file?

前端 未结 7 705
太阳男子
太阳男子 2020-11-29 00:24

I am trying to use WebClient to download a file from web using a WinForms application. However, I really only want to download HTML file. Any other type I will

7条回答
  •  暖寄归人
    2020-11-29 00:59

    I apologize for not been very clear. I wrote a wrapper class that extends WebClient. In this wrapper class, I added cookie container and exposed the timeout property for the WebRequest.

    I was using DownloadDataAsync() from this wrapper class and I wasn't able to retrieve content-type from WebResponse of this wrapper class. My main intention is to intercept the response and determine if its of text/html nature. If it isn't, I will abort this request.

    I managed to obtain the content-type after overriding WebClient.GetWebResponse(WebRequest, IAsyncResult) method.

    The following is a sample of my wrapper class:

    public class MyWebClient : WebClient
    {
        private CookieContainer _cookieContainer;
        private string _userAgent;
        private int _timeout;
        private WebReponse _response;
    
        public MyWebClient()
        {
            this._cookieContainer = new CookieContainer();
            this.SetTimeout(60 * 1000);
        }
    
        public MyWebClient SetTimeout(int timeout)
        {
            this.Timeout = timeout;
            return this;
        }
    
        public WebResponse Response
        {
            get { return this._response; }
        }
    
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
    
            if (request.GetType() == typeof(HttpWebRequest))
            {
                ((HttpWebRequest)request).CookieContainer = this._cookieContainer;
                ((HttpWebRequest)request).UserAgent = this._userAgent;
                ((HttpWebRequest)request).Timeout = this._timeout;
            }
    
            this._request = request;
            return request;
        }
    
        protected override WebResponse GetWebResponse(WebRequest request)
        {
            this._response = base.GetWebResponse(request);
            return this._response;
        }
    
        protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
        {
            this._response = base.GetWebResponse(request, result);
            return this._response;
        }
    
        public MyWebClient ServerCertValidation(bool validate)
        {
            if (!validate) ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };
            return this;
        }
    }
    

提交回复
热议问题