7

Estoy tratando de usar Google GCM para enviar notificaciones automáticas. Pero obtenga una WebException que diga que el servidor remoto devuelve 401 sin autorización. No puedo imaginar por qué no funciona.No autorizado al llamar a Google GCM

¿Alguien que sabe por qué no funciona?

Aquí está mi código:

  ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateServerCertificate); 

      HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://android.googleapis.com/gcm/send"); 


      Request.Method = "POST"; 
      Request.KeepAlive = false; 

      string postData = "{ 'registration_ids': [ '"+registrationId+"' ], 'data': {'message': '"+message+"'}}"; 

      byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

      Request.ContentType = "application/json"; 
      //Request.ContentLength = byteArray.Length; 


      //Request.Headers.Add(HttpRequestHeader.Authorization, "GoogleLogin auth=" + AuthString); 
      Request.Headers.Add(HttpRequestHeader.Authorization, "Authorization: key=AIzaSyCEygavdzrNM3pWNPtvaJXpvW66CKnjH_Y"); 
      //-- Delegate Modeling to Validate Server Certificate --// 


      //-- Create Stream to Write Byte Array --// 
      Stream dataStream = Request.GetRequestStream(); 
      dataStream.Write(byteArray, 0, byteArray.Length); 
      dataStream.Close(); 

      //-- Post a Message --// 
      WebResponse Response = Request.GetResponse(); 
      HttpStatusCode ResponseCode = ((HttpWebResponse)Response).StatusCode; 
      if (ResponseCode.Equals(HttpStatusCode.Unauthorized) || ResponseCode.Equals(HttpStatusCode.Forbidden)) 
      { 
       var text = "Unauthorized - need new token"; 

      } 
      else if (!ResponseCode.Equals(HttpStatusCode.OK)) 
      { 
       var text = "Response from web service isn't OK"; 
      } 

      StreamReader Reader = new StreamReader(Response.GetResponseStream()); 
      string responseLine = Reader.ReadLine(); 
      Reader.Close(); 

enter image description here

+0

¿Qué es la variable ValidateServerCertificate? –

Respuesta

11

Daniel - Amigo hay un problema con la documentación GCM! Use la tecla del navegador como la clave de autorización en el lugar de la clave de la API del servidor. Funcionará.

+0

Lo he intentado, pero no estoy seguro de si es correcto especificar mi dirección IP en los sitios web. Pero ¿por qué recibí una excepción en GetResponse y no un código de respuesta? – Daniel

+0

@Daniel - Amigo, no es necesario! Para la clave del navegador se genera automáticamente y puede usar esto. En segundo lugar, me enfrentaba a un problema similar que se resolvió utilizando la clave del navegador como la clave de autorización. – bhuvin

+0

Recibí el mismo error con la tecla del navegador. Agregué una imagen a la publicación anterior. – Daniel

10

Bien, estoy disparando en la oscuridad aquí. Echar un vistazo a esta línea:

Request.Headers.Add(HttpRequestHeader.Authorization, "Authorization: key=AIzaSyCEygavdzrNM3pWNPtvaJXpvW66CKnjH_Y"); 

¿No debería ser:

Request.Headers.Add(HttpRequestHeader.Authorization, "key=AIzaSyCEygavdzrNM3pWNPtvaJXpvW66CKnjH_Y"); 

Puesto que usted está diciendo que esto es un encabezado de autorización, no hay necesidad de añadir 'Autorización:' otra vez, ¿lo hace?

Además, asegúrese de que la cadena constante 'HttpRequestHeader.Authorization' es 'Autorización'.

+0

Sí, parece correcto. Lo he cambiado y aún tengo una WebException, pero esta vez será 400 Bad Request. – Daniel

+0

400 significa que su carga JSON no puede ser analizada por el servidor GCM. Cambia el formato JSON de comillas simples a comillas dobles. – azgolfer

+0

¡Gracias, ahora está funcionando! – Daniel

Cuestiones relacionadas