HttpWebRequest和GetResponse在1个请求后挂起;其他解决方案对我不起作用

时间:2011-12-04 17:35:43

标签: .net httpwebrequest

更新:

我发现这不是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

1 个答案:

答案 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

然而,它似乎完全解决了我的问题!

让我们希望它坚持=)