[英]WebClient exception when UploadValues
我想這樣呼叫一個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;
}
}
這意味着您的請求花費了超過7秒鍾的時間才能建立連接。 您連接的URL不正確或服務器出現問題。
好的,最后,我決定使用Unity API中的WWW
類而不是.NET API,因為它似乎已經過優化。 如果您想知道我正在使用的代碼,則為:
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
}
}
為什么不使用HttpClient,這是使用httpClient和Json.net的Get / Post請求的簡單代碼
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.