Samuel Prevost
Samuel Prevost

Reputation: 1122

WebClient exception when UploadValues

I want to call a WebClient like this:

using (TimeoutWebClient client = new TimeoutWebClient())
            {
                System.Collections.Specialized.NameValueCollection reqparm = new System.Collections.Specialized.NameValueCollection();
                reqparm.Add("email", email);
                reqparm.Add("pass", password);
                Debug.Log("5");

                if (!string.IsNullOrEmpty(arg))
                        reqparm.Add(arg, "please");

                Uri url = new Uri(URL);
                byte[] responsebytes = client.UploadValues(url, "POST", reqparm);
                Debug.Log("6");
                string responsebody = Encoding.UTF8.GetString(responsebytes);
                // Debug here
                return responsebody;
            }
        }
        catch (TimeoutException)
        {
            Debug.LogWarning("Timeout while request, retry !");
            Debug.Log("7");
        }
        catch (Exception e)
        {
            Debug.LogError("Exception while request: " + e.Message + e.StackTrace);
            return "Error";
        }

but when I run this, sometimes it make a a weird exception which goes like this:

Exception while request: An error occurred performing a WebClient request.  at System.Net.WebClient.UploadValues (System.Uri address, System.String method, System.Collections.Specialized.NameValueCollection data) [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Net.WebClient:UploadValues (System.Uri,string,System.Collections.Specialized.NameValueCollection)

and I don't really know what it mean so if someone already encounter a such strange exception, tell me :X . (I'm making a video game and that's the login post request)

PS: Under Unity and .NET 2.0 but it's almost the same ^^

EDIT: Here is the full log:

Message =  The request timed out   Help link =    Source = System   StackTrace =   at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0 

EDIT: And here is the TimeoutWebClient class:

    public class TimeoutWebClient : WebClient
    {
    private int _timeOut = 7000; // 7s
    public int TimeOut
    {
        get
        {
            return _timeOut;
        }
        set
        {
            _timeOut = value;
        }
    }
    protected override WebRequest GetWebRequest(Uri address)
    {
        WebRequest webRequest = base.GetWebRequest(address);
        webRequest.Timeout = _timeOut;
        if (webRequest is HttpWebRequest)
        {
            (webRequest as HttpWebRequest).KeepAlive = false;
            (webRequest as HttpWebRequest).Timeout = _timeOut; //(tried different values)
        }
        return webRequest;
    }
}

Upvotes: 0

Views: 4178

Answers (3)

Samuel Prevost
Samuel Prevost

Reputation: 1122

Ok, finally, I decided to use the WWW class from Unity API instead of .NET API because it seems to be optimised. If you want to know the code I'm using, here it is:

    WWWForm form = new WWWForm();
    form.AddField("email", email);
    form.AddField("pass", password);

    if (!string.IsNullOrEmpty(arg))
        form.AddField(arg, "please");

    WWW www = new WWW(URL, form);
    // Wait until the request has been sent
    yield return www;

    if (www.isDone)
    {
        Debug.Log("WWW text = " + www.text);
        if (callback(www.text))
        {
            // we are logged
        }
        else
        {
            // we arn't
        }
    }

Upvotes: 0

esiprogrammer
esiprogrammer

Reputation: 1438

Why you're not using HttpClient instead, here is a simple code of Get/Post request using httpClient and Json.net

     public async Task<T> MakeHttpClientRequestASync<T>(string requestUrl, string authenticationToken,
        Dictionary<string, string> requestContent, HttpMethod verb, Action<Exception> error)
    {
        var httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.CacheControl = new CacheControlHeaderValue() { NoCache = true };
        HttpResponseMessage response;

        var returnVal = default(T);

        try
        {
            if (verb == HttpMethod.Post)
            {
                response = await httpClient.PostAsync(requestUrl, new FormUrlEncodedContent(requestContent));
            }
            else
            {
                response = await httpClient.GetAsync(requestUrl);
            }

            var resultString = await response.Content.ReadAsStringAsync();
            returnVal = JsonConvert.DeserializeObject<T>(resultString);
        }
        catch (Exception ex)
        {
            error(ex);
        }

        return returnVal;
    }

Upvotes: -1

Scott Chamberlain
Scott Chamberlain

Reputation: 127603

It means your request is taking longer than 7 seconds to connect. Either the URL you are connecting to is incorrect or there is a issue with the server.

Upvotes: 0

Related Questions