ОБНОВЛЕНО:
Я обнаружил, что это не проблема C2DM, а некоторая проблема с HttpWebRequest и его GetResponse, см. Комментарии ниже.
/ ENDРЕДАКТИРОВАТЬ
Итак, я установил соединение с системой Googles C2DM.Это работает - вроде.
Когда я прошу C2DM «пропинговать» мое устройство Android, иногда это происходит, но далеко не всегда.Проблема проявляется на стороне сервера.
Обычно первый "пинг" (после запуска сервера) проходит.Я получаю ответ сразу после вызова веб-службы, и вскоре после этого на моем устройстве Android появляется «ping».
Однако, если я вскоре после первого «ping» снова скажу моему серверу отправить «ping»msgstr "вызов веб-службы завершился неудачно.Ему никогда не удается вызвать C2DM, и через некоторое время я получаю WebException (C #), который говорит следующее:
Основное соединение было закрыто: при получении произошла непредвиденная ошибка.
Никакой другой информации там нет.Если я попытаюсь отправить еще раз, этот вызов также будет заблокирован.
Я ничего не изменяю в коде, иногда ему удается вызвать веб-сервис, а иногда нет.Мне кажется, что есть время ожидания для вызова веб-службы Google.Если вы звоните, вам нужно подождать X секунд, прежде чем звонить снова, иначе он просто не вернет ответ и не выдаст исключение.Вот только догадка ...
Есть идеи?
Это код, который выполняется при отправке ...
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(GoogleMessageUrl); // the google url
request.Method = "POST"
request.KeepAlive = false;
NameValueCollection postFieldNameValue = new NameValueCollection();
postFieldNameValue.Add(RegistrationIdParam, registrationId); // a valid reg id for an android device
postFieldNameValue.Add(CollapseKeyParam, "0");
postFieldNameValue.Add(DelayWhileIdleParam, "0");
postFieldNameValue.Add(DataPayloadParam, message);
string postData = GetPostStringFrom(postFieldNameValue);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded;charset=UTF-8";
request.ContentLength = byteArray.Length;
request.Headers.Add(HttpRequestHeader.Authorization, "GoogleLogin auth=" + _authTokenString);
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
HttpStatusCode responseCode = ((HttpWebResponse)response).StatusCode;
if (responseCode.Equals(HttpStatusCode.Unauthorized) || responseCode.Equals(HttpStatusCode.Forbidden))
{
Console.WriteLine("Unauthorized - need new token");
}
else if (!responseCode.Equals(HttpStatusCode.OK))
{
Console.WriteLine("Response from web service not OK :");
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
}
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseLine = reader.ReadLine();
reader.Close();
response.Close();
return responseLine; // it never gets here, but an Exception is caught elsewhere