7

Ho provato a utilizzare Google GCM per l'invio di notifiche push. Ma ottieni una WebException che dice che il server remoto restituisce 401 non autorizzati. Non posso rinunciare perché non funziona.Non autorizzato quando si chiama Google GCM

Chiunque sappia perché non funziona?

Ecco il mio codice:

  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

Qual è la variabile ValidateServerCertificate? –

risposta

11

Daniel - Amico c'è un problema con la documentazione GCM! Utilizzare la chiave del browser come chiave di autorizzazione al posto della chiave API del server. Funzionerà.

+0

L'ho provato, ma non sono sicuro se è corretto specificare il mio indirizzo IP sui siti web. Ma perché ho ricevuto un'eccezione su GetResponse e non un codice di risposta? – Daniel

+0

@Daniel - Amico, non ne hai bisogno! Per la chiave del browser è auto generare e si potrebbe usare questo. In secondo luogo ero di fronte al problema simile che è stato risolto utilizzando la chiave del browser come chiave di autorizzazione. – bhuvin

+0

Ho ricevuto lo stesso errore con la chiave del browser. Ho aggiunto un'immagine al post di cui sopra. – Daniel

10

OK, sto solo girando al buio qui. Date un'occhiata a questa linea:

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

non dovrebbe essere:

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

Dato che si sta dicendo che questo è un colpo di testa di autorizzazione, non c'è bisogno di aggiungere 'autorizzazione:' ancora una volta, lo fa?

Inoltre, assicurarsi che la costante di stringa "HttpRequestHeader.Authorization" sia "Autorizzazione".

+0

Sì, ha ragione. L'ho cambiato e ho ancora una WebException, ma questa volta sarà 400 Bad Request. – Daniel

+0

400 significa che il tuo payload JSON non può essere analizzato dal server GCM. Cambia la tua formattazione JSON da virgolette singole a virgolette doppie. – azgolfer

+0

Grazie, ora funziona !! – Daniel