次のように WebClient を呼び出したい:
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";
}
しかし、これを実行すると、次のような奇妙な例外が発生することがあります。
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)
私はそれが何を意味するのかよくわからないので、誰かがすでにそのような奇妙な例外に遭遇した場合は、教えてください :X 。(私はビデオ ゲームを作成しており、それがログイン ポスト リクエストです)
PS: Unity と .NET 2.0 の下ですが、ほとんど同じです ^^
編集:ここに完全なログがあります:
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
編集: そして、ここに TimeoutWebClient クラスがあります:
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;
}
}