2011-12-01 44 views
0

我正在从我的asp.net项目发送推送消息到android手机和 我已经把register_id放在我的代码中,但我处理错误缺少注册,我不明白其原因。C2DM错误= MissingRegistration我已经把registration_id请求

这里是我的代码:

public void SendMessage(string registrationId, string data, string sAuth) 
{ 
    string collapseKey = Guid.NewGuid().ToString("n"); 

    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate); 

    string url = "https://android.apis.google.com/c2dm/send?"; 
    url = url + HttpUtility.UrlEncode("registration_id=" + registrationId + "&collapse_key=" + collapseKey + "&data.payload=" + data); 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
    request.Method = "POST"; 
    request.Headers.Add("Authorization", "GoogleLogin auth=" + sAuth); 
    //request.ContentLength = 0; 

    string encoded = HttpUtility.UrlEncode(url); 

    ASCIIEncoding encoding = new ASCIIEncoding(); 
    byte[] buffer = encoding.GetBytes(encoded); 

    Stream newStream = request.GetRequestStream(); 
    newStream.Write(buffer, 0, buffer.Length); 
    newStream.Close(); 

    //Reading return Response 

    try 
    { 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      Stream resStream = response.GetResponseStream(); 
      StreamReader sr = new StreamReader(resStream); 
      string value = sr.ReadToEnd().ToString(); 
      Label1.Text = value; 
      //Response.Write(sr.ReadToEnd()); 
      sr.Close(); 
      resStream.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw (ex); 
    } 
} 

回答

0

©解决这样的问题;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://android.clients.google.com/c2dm/send"); 
     request.Method = "POST"; 
     request.KeepAlive = false; 

     NameValueCollection postFieldNameValue = new NameValueCollection(); 
     postFieldNameValue.Add("registration_id", registrationId); 
     postFieldNameValue.Add("collapse_key", "1"); 
     postFieldNameValue.Add("delay_while_idle", "0"); 
     postFieldNameValue.Add("data.message", 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(); 
     //savas 
     ServicePointManager.ServerCertificateValidationCallback += delegate(
        object 
        sender, 
        System.Security.Cryptography.X509Certificates.X509Certificate 
        pCertificate, 
        System.Security.Cryptography.X509Certificates.X509Chain pChain, 
        System.Net.Security.SslPolicyErrors pSSLPolicyErrors) 
     { 
      return true; 
     }; 
     ////*********** 

     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(); 
0

如果这是第一次在设备上运行应用程序,那么你必须先办理注册ID。更多细节可以在这里找到:http://code.google.com/android/c2dm/index.html

如果不是这样,那么你必须考虑到这个问题:“C2DM服务器定期刷新注册ID。”女巫意味着你必须处理你的注册ID的每一个刷新。

希望它有帮助。

+0

我运行我的android应用程序,我处理registration_id,我试图发送推送消息这个ID,但我不能谷歌响应我“错误= MissingRegistration” –

+0

你可以检查registrationId不是空?您可以尝试捕捉HTTP请求中使用的网址,检查是否包含注册ID值 – Hicham

+0

我正在调试项目registrationId不为空,但已经谷歌回应我这个错误... –

1

可以试试这段代码。我认为问题来自网址和请求参数。

public void SendMessage(string registrationId, string data, string sAuth) 
{ 
    string collapseKey = Guid.NewGuid().ToString("n"); 

    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate); 

    string url = "https://android.apis.google.com/c2dm/send"; 
    string params = HttpUtility.UrlEncode("registration_id=" + registrationId + "&collapse_key=" + collapseKey + "&data.payload=" + data); 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); 
    request.Method = "POST"; 
    request.Headers.Add("Authorization", "GoogleLogin auth=" + sAuth); 
    //request.ContentLength = 0; 

    ASCIIEncoding encoding = new ASCIIEncoding(); 
    byte[] buffer = encoding.GetBytes(params); 

    Stream newStream = request.GetRequestStream(); 
    newStream.Write(buffer, 0, buffer.Length); 
    newStream.Close(); 

    //Reading return Response 

    try 
    { 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     if (response.StatusCode == HttpStatusCode.OK) 
     { 
      Stream resStream = response.GetResponseStream(); 
      StreamReader sr = new StreamReader(resStream); 
      string value = sr.ReadToEnd().ToString(); 
      Label1.Text = value; 
      //Response.Write(sr.ReadToEnd()); 
      sr.Close(); 
      resStream.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw (ex); 
    } 
} 
+0

谢谢我解决像我这样的问题回答。 –

0

在这种方法中SendMessage(string registrationId, string data, string sAuth)没有得到的Andriod设备通知,并没有任何error信息,怎么办?