Search code examples
c#unity-game-enginewebclientwebclient.uploaddata

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;
    }
}

Solution

  • 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
            }
        }