0

次のように 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;
    }
}
4

3 に答える 3

0

最後に、WWW最適化されているように見えるため、.NET API の代わりに Unity 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
        }
    }
于 2016-03-03T17:17:07.767 に答える
-1

代わりに 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;
    }
于 2016-03-03T15:43:11.530 に答える