更新:
我发现这不是C2DM问题,但是HttpWebRequest及其GetResponse存在一些问题,请参阅下面的评论。
/ END EDIT
所以我建立了与Googles C2DM系统的连接。它有用 - 有点像。
当我要求C2DM“ping”我的Android设备时,它有时会这样做,但远非总是如此。问题表现在服务器端。
通常,第一个“ping”(在服务器启动之后)经历。我打电话给网络服务后立即收到回复,不久之后我的Android设备就会显示“ping”。
但是,如果我在第一次“ping”后不久再次告诉我的服务器发送“ping”,则webservice调用失败。它从来没有设法调用C2DM,过了一段时间我得到一个WebException(C#)说下面的内容:
基础连接已关闭:发生意外错误 收到。
没有其他信息。如果我再次尝试发送,则该呼叫也会被阻止。
我在代码中没有任何改变,有时它设法调用webservice,有时它不会。在我看来,调用Google网络服务存在“超时”。如果你调用它,你需要等待X秒才能再次调用,否则它将不会返回一个答案并给出异常。这只是猜测...
有什么想法吗?
这是在send ...
上执行的代码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
答案 0 :(得分:3)
所以,我花了最后48小时测试,阅读,搜索HttepWebRequest问题的解决方案,或者更确切地说是HTTP请求的问题。
我找到的所有建议对我都没有用,除了这个:
http://www.eggheadcafe.com/community/vb/14/60113/webclient-to-http-post--error-on-receive.aspx
有说
经过对互联网的大量研究,我偶然发现了一些建议 说将Keep-Alive设置为FALSE并使用HTTP1.0。
但他也注意到它对他不起作用:
然而,当我尝试使用该功能时,我无法成功 在EITHER机器上执行任何POST - 我的家或工作PC
然而,它似乎完全解决了我的问题!
让我们希望它坚持=)