HttpWebRequest и GetResponse зависает после 1 запроса;другие решения не работают для меня - PullRequest
1 голос
/ 04 декабря 2011

ОБНОВЛЕНО:

Я обнаружил, что это не проблема 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

1 Ответ

3 голосов
/ 05 декабря 2011

ха-ха, похоже, мне снова нужно ответить на свой вопрос =)

Итак, последние 48 часов я потратил на тестирование, чтение, поиск решения проблемы HttepWebRequest или, скорее, проблему сHTTP-запросы.

Все советы, которые я нашел, были бесполезны для меня, кроме этого:

http://www.eggheadcafe.com/community/vb/14/60113/webclient-to-http-post--error-on-receive.aspx

Там говорится, что

После долгих исследований в интернете я наткнулся на предложения, в которых говорится, что для Keep-Alive следует установить значение FALSE и использовать HTTP1.0.

, но он также отмечает, что у него это не сработало:

Однако, когда я пытаюсь использовать эту функцию, я не могу успешно выполнить ЛЮБЫЕ ПОЧТЫ на ЛЮБОМ компьютере - на моем домашнем или рабочем компьютере

Однако, похоже, чтополностью решил мою проблему!

Будем надеяться, что она застрянет =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...