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