2

GCM を使用して Android 用のプッシュ通知を作成しました。
サービスは多くのタイムアウトに直面しており、断続的に動作します。任意の時間 (この場合は 30 秒) に実行され、 Message Queue をチェックする Windows サービスがあり、メッセージが存在する場合は、それぞれのデバイスに送信します。
パターンは :
最初の 2 回で 3 回動作し、1 回失敗すると、連続して失敗し始めます。

失敗の原因は何ですか?

編集 これは組織のファイアウォールが原因で発生している可能性があると思いましたが、オープンネットワークで試したので、それは過剰に支配される可能性もあります. 任意の入力、思考ラインが役立ちます。 前もって感謝します

コード :

private void SendAndroidMessage(string deviceID,string Message ,DeviceDataModel ddm)
        {

         StringBuilder postMsgBuilder = new StringBuilder();
            postMsgBuilder.Append("registration_id=").Append(deviceID);
            //postMsgBuilder.Append("&").Append("delay_while_idle=").Append("false");
            postMsgBuilder.Append("&").Append("data.message=").Append(Message);

            byte[] messageBytes = Encoding.UTF8.GetBytes(postMsgBuilder.ToString());

            var request = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send");

            // Hook a callback to verify the remote certificate
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(C2dmCertValidationCallback);
            request.Method = WebRequestMethods.Http.Post;
            request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
            request.ContentLength = messageBytes.Length;
            request.Headers.Add(HttpRequestHeader.Authorization, "key=" + AuthorisationKey);

            bool sent = false;
            int tries = 0;
            HttpWebResponse response;
            while (!sent && tries < this.numOfRetries)
            {
                try
                {
                    using (var requestStream = request.GetRequestStream())
                    {
                        // we are not using retries yet.. or looking for errors here. We should log errors too.
                        requestStream.Write(messageBytes, 0, messageBytes.Length);
                    }

                    // Sends the notification and gets the response.
                    response = (HttpWebResponse)request.GetResponse();
                    if (response.StatusCode == HttpStatusCode.NotFound)
                    {
                        return;
                    }

                    if (response.StatusCode != HttpStatusCode.OK)
                    {
                        tries++;
                        if (tries > this.numOfRetries)
                        {
                            if (this.NotificationFailed != null)
                            {
                                this.NotificationFailed(this, new NotificationEventArgs(new NotificationException(string.Format(CultureInfo.InvariantCulture, "{0} notification failures for {1} for DeviceId:{2} of DeviceType:{3}. Giving up", this.numOfRetries, C2dmUrlStr,ddm.DeviceId,ddm.DeviceType))));
                            }

                            return;
                        }
                    }
                    else
                    {
                        sent = true;
                    }
                }
                catch (WebException e)
                {
                    // check why we got the exception 
                    string responseString = "";
                    if (e.Response != null)
                    {
                        StreamReader reader = new StreamReader(e.Response.GetResponseStream());
                       responseString= reader.ReadToEnd();
                    }
                    if (this.NotificationFailed != null)
                    {
                        this.NotificationFailed(this, new NotificationEventArgs(new NotificationException("Notification failed with exception " + e.Message + "for " + "https://android.googleapis.com/gcm/send"+" DeviceId: "+ddm.DeviceId+" Device Type: "+ddm.DeviceType+"Response String : "+ responseString, e)));
                    }

                    throw;
                }
            }
        }
4

1 に答える 1

2

私もかつて同様の問題に直面しましたが、奇妙なことに、それを読み取った後に応答ストリームを閉じていなかったことが原因でした。response.Close();を読んだ後、電話してみてくださいresponse。それがあなたにもうまくいくことを願っています。

于 2012-08-03T06:55:41.217 に答える