Azure WNS Push per REST API

Um eine Push Nachricht über Windows Notification Services (WNS) zu senden Es wird hier auf die NotificationHubClient Helper Klasse verzichtet und die native REST Api des Azure Notificcation Hub genutzt.

Ausgehend vom Hub Connection String und dem Hubnamen kann man mit passenden Header und HTTPClient das auch nachbauen. Als Analyse Werkzeug ist Fiddler empfohlen. Ist die HTTP Status Meldung 201 ist alles ok. Im anderen Falle stehen im Response hilfreiche Fehlermeldungen.

   1:    NotificationHubClient hub = NotificationHubClient
   2:              .CreateClientFromConnectionString("
Endpoint=sb://ppedvpush.servicebus.windows.net/;
SharedAccessKeyName=DefaultFullSharedAccessSignature;
   3:  SharedAccessKey=b8aJdxxxxxxxxxxxxxxxxxxxxxxxWnbI4="
   4:                 , "ppedvhub1");

So wars bisher. Es wird daraus extrahiert für Authentifizierung SasKey und SasValue. Der Hubname und die Url für den Service braucht die Version.

Content Type muss passen, der Header noch wns/raw beinhalten und das format windows.

   1:   private async void button2_ClickAsync(object sender, EventArgs e)
   2:          {
   3:             var endpoint = "https://ppedvpush.servicebus.windows.net/";
   4:              var hub = "ppedvhub1";
   5:              string uri = endpoint + hub + "/messages?api-version=2016-07";
   6:              using (var httpClient = new HttpClient())
   7:              {
   8:                  var request = new HttpRequestMessage(HttpMethod.Post, uri);
   9:                  request.Content = new StringContent("Burghausen");
  10:                  request.Content.Headers.Clear();
  11:                  request.Content.Headers.Add("Content-Type", "application/octet-stream");
  12:                  request.Headers.Add("X-WNS-Type", "wns/raw");
  13:                  request.Headers.Add("ServiceBusNotification-Format", "windows");
  14:                  request.Headers.Add("Authorization", GenerateSaSToken(uri, 
  15:  "DefaultFullSharedAccessSignature", "b8aJdXHxxxxxxxxxxxxxxxxxxxxxxWnbI4="));
  16:                  var response = await httpClient.SendAsync(request);
  17:                  await response.Content.ReadAsStringAsync();
  18:              }
  19:   
  20:          }

Soweit ist das noch hinzubekommen. Die Logik hinter dem Authorizaton Token ist allerdings etwas komplexer. Der folgende C# Code ist kopiert und leicht modifiziert.

   1:  private static string GenerateSaSToken(string uri, string SasKeyName, string SasKeyValue)
   2:          {
   3:              var targetUri = WebUtility.UrlEncode(uri.ToLower()).ToLower();
   4:              var expiresOnDate = Convert.ToInt64(DateTime.UtcNow.Subtract
   5:                  (new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds) + 60 * 60;
   6:              var toSign = targetUri + "\n" + expiresOnDate;
   7:              var keyBytes = Encoding.UTF8.GetBytes(SasKeyValue);
   8:              var mac = new HMACSHA256(keyBytes);
   9:              mac.Initialize();
  10:              var rawHmac = mac.ComputeHash(Encoding.UTF8.GetBytes(toSign));
  11:              var signature = WebUtility.UrlEncode(Convert.ToBase64String(rawHmac));
  12:              var token = "SharedAccessSignature sr=" + targetUri + "&sig="
  13:                      + signature + "&se=" + expiresOnDate + "&skn=" + SasKeyName;
  14:              return token;
  15:          }

In Fiddler sollte dann so ein Request so aussehen

POST https://ppedvpush.servicebus.windows.net/ppedvhub1/messages?api-version=2016-07 HTTP/1.1
Content-Type: application/octet-stream
X-WNS-Type: wns/raw
ServiceBusNotification-Format: windows
User-Agent: SERVICEBUS/2016-07(api-origin=DotNetSdk;os=Win32NT;os-version=6.2.9200.0)
TrackingId: 7f2a5605-ce43-4fb3-b578-2d12a790c9ef
Authorization: SharedAccessSignature sr=http%3a%2f%2fppedvpush.servicebus.windows.net%2fppedvhub1%2fmessages%2f%3fapi-version%3d2016-07&sig=pLiZmvxxxxxxxxRaA8%3d&se=1484402487&skn=DefaultFullSharedAccessSignature
X-PROCESS-AT: ServiceBus
Host: ppedvpush.servicebus.windows.net
Content-Length: 13
Expect: 100-continue
Connection: Keep-Alive

Kommentare sind geschlossen