0

この例外はどのように可能ですか?

以下のようにグーグルサービスと呼んでいます。私のログは、オンラインでタイムアウト例外が発生したことを識別しましたvar requestStream = request.GetRequestStream();

catch読み取りストリームが文字列(かなり小さい)から取得していると思ったので、ブロック内に配置することさえしませんでした。では、どうすればこれでタイムアウトを取得できますか?グーグルサーバーに時間がかかり、読み取りが遅くなり、これが発生する可能性はありますか?

// Google had issues with SSL certificates. We know address is good, so just kill validation
            // and trust any certificate it might have..
            ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;


// Prepare HTTPS request. 5 seconds timeout should be good for google.
            const string Uri = "https://android.apis.google.com/c2dm/send";
            var request = (HttpWebRequest)WebRequest.Create(Uri);
            request.Headers.Add("Authorization", "GoogleLogin auth=" + this.SecurityToken);
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";
            request.Timeout = 5000;

            // build the post string     
            var postString = new StringBuilder();
            postString.AppendFormat("registration_id={0}", recipientId);
            postString.AppendFormat("&data.payload={0}", message);
            postString.AppendFormat("&collapse_key={0}", collapseKey);

            // write the post-string as a byte array     
            var requestData = Encoding.ASCII.GetBytes(postString.ToString());
            request.ContentLength = requestData.Length;
            var requestStream = request.GetRequestStream();
            requestStream.Write(requestData, 0, requestData.Length);
            requestStream.Close();

            // Do the actual request and read the response stream  
            try
            {
                var response = request.GetResponse();
                var responseString = GetResponseString(response);
                response.Close();

                return responseString.Contains("id=") 
                    ? SendStatus.Ok 
                    : GetSendStatusFromResponse(responseString);
            }
            catch (WebException ex)
            {
                var webResponse = (HttpWebResponse)ex.Response;
                if (webResponse != null)
                {
4

1 に答える 1

1

GetRequestStream接続を開き、すでに接続されているストリームを返します。ストリームに書き込んだものはすべて、すぐにネットワークに送信されます。最初に完全にバッファリングされるわけではありません(ただし、ある程度のバッファリングはほぼ確実に含まれます)。

したがって、タイムアウトする可能性があることは理にかなっています。これは、TCP接続を確立できなかったことを意味します。これは、接続が確立された時点であるためです。

于 2012-06-22T16:16:38.997 に答える