2016-04-13 2 views
1

Gibt es eine Möglichkeit, eine Benachrichtigung mit der UWP-App über NotificationHub zu senden? In vielen Lernprogrammen senden sie Benachrichtigungen mit einer C# -Konsolenanwendung mithilfe des Microsoft.Azure.NotificationHubs-Nuget-Pakets. Ich kann dieses Paket nicht in einer UWP-App installieren. Kann ich speziell eine Benachrichtigung an ein getaggtes Gerät senden, das ich bei RegisterNativeAsync registriere?NotificationHub Benachrichtigung im registrierten Tag senden UWP

Antwort

0

Ich fand schließlich die Lösung. Der Code ist wie @ Kyle, aber ich hatte

request.Headers.Add("X-WNS-Type", "wns/toast"); 

hinzuzufügen, um eine Push-Benachrichtigung

M ore details

-1

Haben Sie versucht, WindowsAzure.Messaging.Managed? Probieren Sie es einfach mit dem W10 UWP. Benachrichtigung Hub REST-APIs zur Verwendung von über Httpclient, ohne die Ausgaben für Plattform-Kompatibilität

https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-windows-store-dotnet-get-started/

+0

Ja natürlich zu schicken, aber ich kann nicht ein Beispiel für das Senden einer Benachrichtigung finden. Nur mit NotificationHub-Klasse empfangen. – GeralexGR

1

Per meiner Erfahrung, ich denke, die einfache Möglichkeit, Nachrichten in einem UWP-App für das Senden ist.

Bitte beachten Sie das Dokument Notification Hubs REST APIs.

Sie können versuchen, auf das Dokument Using REST APIs from a Backend zu verweisen, um Ihre UWP-App als Backend zum Senden von Nachrichten zu verwenden. Zum Beispiel Send a WNS Native Notification.

Ich hoffe, es hilft.

+0

Das hat sehr geholfen. Ich versuche jetzt, eine Benachrichtigung mit 'HttpRequestMessage' und' HttpClient' zu senden, aber ich bekomme einen 500 Internal Server Fehler. Hast du eine Idee, warum das passiert? Ich verwende [diese Authentifizierung] (https://msdn.microsoft.com/en-us/library/azure/dn495627.aspx) – GeralexGR

+0

@ Jerrak0s Könnten Sie Ihren Code für die Analyse des Problems freigeben? –

+0

'using (var httpClient = new HttpClient()) { var request = neue HttpRequestMessage (HttpMethod.Post, uri); request.Content = neuer StringContent (toast); request.Headers.Add ("Autorisierung", getSaSToken (URL, 1000)); request.Headers.Add ("ServiceBusNotification-Tags", "TAG"); request.Headers.Add ("ServiceBusNotification-Format", "windows"); var Antwort = erwarten httpClient.SendAsync (Anfrage); warten response.Content.ReadAsStringAsync(); } '' – GeralexGR

0

Hier ist ein funktionierender Code, der eine Benachrichtigung von einem UWP über einen Azure Notification Hub sendet (es wird jedoch GCM anstelle von WNS verwendet. Weitere Informationen zum Ändern des Codes in der genehmigten Antwort). Es braucht natürlich ein paar Änderungen wie der Name deines Hub, siehe die Kommentare im Code für weitere Informationen.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Net.Http; 
using System.Runtime.InteropServices.WindowsRuntime; 
using System.Text; 
using Windows.Foundation; 
using Windows.Foundation.Collections; 
using Windows.Security.Cryptography; 
using Windows.Security.Cryptography.Core; 
using Windows.Storage.Streams; 
using Windows.UI.Xaml; 
using Windows.UI.Xaml.Controls; 
using Windows.UI.Xaml.Controls.Primitives; 
using Windows.UI.Xaml.Data; 
using Windows.UI.Xaml.Input; 
using Windows.UI.Xaml.Media; 
using Windows.UI.Xaml.Navigation; 


namespace SendNotification 
{ 
    public sealed partial class MainPage : Page 
    { 
     public MainPage() 
     { 
      this.InitializeComponent(); 
      this.sendNotification(); 
     } 

     string Endpoint = ""; 
     string SasKeyName = ""; 
     string SasKeyValue = ""; 

     public void ConnectionStringUtility(string connectionString) 
     { 
      //Parse Connectionstring 
      char[] separator = { ';' }; 
      string[] parts = connectionString.Split(separator); 
      for (int i = 0; i < parts.Length; i++) 
      { 
       if (parts[i].StartsWith("Endpoint")) 
        Endpoint = "https" + parts[i].Substring(11); 
       if (parts[i].StartsWith("SharedAccessKeyName")) 
        SasKeyName = parts[i].Substring(20); 
       if (parts[i].StartsWith("SharedAccessKey")) 
        SasKeyValue = parts[i].Substring(16); 
      } 
     } 


     public string getSaSToken(string uri, int minUntilExpire) 
     { 
      string targetUri = Uri.EscapeDataString(uri.ToLower()).ToLower(); 

      // Add an expiration in seconds to it. 
      long expiresOnDate = DateTime.Now.Ticks/TimeSpan.TicksPerMillisecond; 
      expiresOnDate += minUntilExpire * 60 * 1000; 
      long expires_seconds = expiresOnDate/1000; 
      String toSign = targetUri + "\n" + expires_seconds; 

      // Generate a HMAC-SHA256 hash or the uri and expiration using your secret key. 
      MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256); 
      BinaryStringEncoding encoding = BinaryStringEncoding.Utf8; 
      var messageBuffer = CryptographicBuffer.ConvertStringToBinary(toSign, encoding); 
      IBuffer keyBuffer = CryptographicBuffer.ConvertStringToBinary(SasKeyValue, encoding); 
      CryptographicKey hmacKey = macAlgorithmProvider.CreateKey(keyBuffer); 
      IBuffer signedMessage = CryptographicEngine.Sign(hmacKey, messageBuffer); 

      string signature = Uri.EscapeDataString(CryptographicBuffer.EncodeToBase64String(signedMessage)); 

      return "SharedAccessSignature sr=" + targetUri + "&sig=" + signature + "&se=" + expires_seconds + "&skn=" + SasKeyName; 
     } 


     public async void sendNotification() 
     { 
      ConnectionStringUtility("YOURHubFullAccess"); //insert your HubFullAccess here (a string that can be copied from the Azure Portal by clicking Access Policies on the Settings blade for your notification hub) 

      //replace YOURHUBNAME with whatever you named your notification hub in azure 
      var uri = Endpoint + "YOURHUBNAME" + "/messages/?api-version=2015-01"; 
      string json = "{\"data\":{\"message\":\"" + "Hello World!" + "\"}}"; 


      //send an HTTP POST request 
      using (var httpClient = new HttpClient()) 
      { 
       var request = new HttpRequestMessage(HttpMethod.Post, uri); 
       request.Content = new StringContent(json); 

       request.Headers.Add("Authorization", getSaSToken(uri, 1000)); 
       request.Headers.Add("ServiceBusNotification-Format", "gcm"); 
       var response = await httpClient.SendAsync(request); 
       await response.Content.ReadAsStringAsync(); 
      } 
     } 
    } 
} 
+0

Funktioniert das für Sie? Ich bekomme eine 400 schlechte Anfrage Fehler – GeralexGR

+0

@ Jerrak0s ja es tut, ich habe es mehrmals getestet, auch auf verschiedenen Computern. Überprüfen Sie die HubFullAccess-Zeichenfolge und den Namen Ihres Hubs und stellen Sie sicher, dass Sie sie an der richtigen Stelle im Code eingeben. Stellen Sie außerdem sicher, dass Sie Ihren Hub korrekt konfiguriert haben. Ich habe diesen Leitfaden persönlich dazu verwendet, ihn zu konfigurieren: https://azure.microsoft.com/en-us/documentation/articles/notification-hubs-android-get-started/ Wenn Sie weitere Fragen haben, lassen Sie es mich wissen und ich werde versuchen, Ihnen so gut wie möglich zu helfen. – Kyle