7

Próbuję użyć Google GCM do wysyłania powiadomień push. Ale zdobądź wyjątek WebException, który mówi, że serwer zdalny zwraca 401 nieautoryzowane. Nie wiem, dlaczego to nie działa.Nieautoryzowane podczas nawiązywania połączenia z Google GCM

Ktoś, kto wie, dlaczego to nie działa?

Oto mój kod:

  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

Co to jest zmienna ValidateServerCertificate? –

Odpowiedz

11

Daniel - Koleś jest problem z dokumentacją GCM! Użyj klucza przeglądarki jako klucza autoryzacji w miejscu klucza serwera API. To będzie działać.

+0

Próbowałem już, ale nie jestem pewien, czy to jest poprawne, aby określić mój adres IP na stronach internetowych. Ale dlaczego dostałem wyjątek od GetResponse, a nie kod odpowiedzi? – Daniel

+0

@Daniel - Dude u dont need! Klawisz przeglądarki generuje się automatycznie i możesz go użyć. Po drugie stanąłem przed podobnym problemem, który został rozwiązany przy użyciu klucza przeglądarki jako klucza autoryzacji. – bhuvin

+0

Mam ten sam błąd z klawiszem przeglądarki. Dodałem obraz do postu powyżej. – Daniel

10

OK, ja po prostu kręcę w ciemności tutaj. Spójrz na tej linii:

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

Nie powinno to być:

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

Skoro mówisz to jest to nagłówek Authorization, nie ma potrzeby dodawania „zezwolenie:” raz, czy to?

Upewnij się również, że ciąg znaków "HttpRequestHeader.Authorization" to "Autoryzacja".

+0

Tak, to się zgadza. Zmieniłem go i wciąż mam wyjątek WebException, ale tym razem będzie to 400 Bad Request. – Daniel

+0

400 oznacza, że ​​twój ładunek JSON nie może zostać przeanalizowany przez serwer GCM. Zmień formatowanie JSON z pojedynczego cudzysłowu na podwójny cudzysłów. – azgolfer

+0

Dziękuję, teraz działa! – Daniel

Powiązane problemy