Ошибка C2DM = MissingRegistration я уже поместил регистрационный_идентификатор для запроса - PullRequest
0 голосов
/ 01 декабря 2011

Я работаю, чтобы отправить push-сообщение на телефон Android из моего проекта asp.net и я уже добавил в свой код register_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);
    }
}

Ответы [ 4 ]

1 голос
/ 01 декабря 2011

Можете попробовать этот код. Я думаю, что проблема исходит от URL и параметров запроса.

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 голосов
/ 30 января 2012

В этом методе SendMessage(string registrationId, string data, string sAuth) не получить уведомление в Andriod Устройство и нет любого error сообщения, что делать?

0 голосов
/ 02 декабря 2011

Я решаю проблему следующим образом;

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 голосов
/ 01 декабря 2011

Если вы впервые запускаете приложение на своем устройстве, тогда вам нужно обработать первый регистрационный идентификатор. Более подробную информацию можно найти здесь: http://code.google.com/android/c2dm/index.html

Если это не так, то вы должны принять во внимание эту проблему: «Сервер C2DM периодически обновляет регистрационные идентификаторы». Ведьма означает, что вы должны обрабатывать каждое обновление вашего регистрационного идентификатора.

Надеюсь, это поможет.

...