簡體   English   中英

上傳值時出現WebClient異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM