2

Я создаю приложение для Windows Phone и не могу использовать класс Microsoft.ServiceBus.Messaging.QueueClient.Отправить сообщение Azure Service Bus Queue or Topic с помощью REST API

Затем я пытаюсь использовать API REST Azure Service Bus для отправки, но для этого требуется создать токен SAS. Но для сборки токена SAS мне нужно использовать Windows.Security.Cryptography.Core.MacAlgorithmNames.HmacSha256. Этот класс отображается в режиме «вперед», но при компиляции его не существует.

Как отправить сообщение в очередь или тему служебной шины с помощью API отправки REST?

ответ

1

Я включу полный код, который отправит сообщение на служебную шину с использованием REST API, включая создание маркера SAS и хэш HmacSha256.

Вам необходимо обновить образец с уникальным Service Bus имен и ключей, и вы, вероятно, хотите сохранить его где-то лучше, чем в методе ...

Как создать маркер SAS документирована в http://msdn.microsoft.com/library/azure/dn170477.aspx и https://code.msdn.microsoft.com/windowsazure/Service-Bus-HTTP-Token-38f2cfc5.

Я взял реализацию HmacSha256 от HMACSHA256 on Windows Phone 8.1?

private static void SendSBMessage(string message) 
{ 
    try 
    { 
     string baseUri = "https://<your-namespace>.servicebus.windows.net"; 
     using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient()) 
     { 
      client.BaseAddress = new Uri(baseUri); 
      client.DefaultRequestHeaders.Accept.Clear(); 

      string token = SASTokenHelper(); 
      client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("SharedAccessSignature", token); 

      string json = JsonConvert.SerializeObject(message); 
      HttpContent content = new StringContent(json, Encoding.UTF8); 
      content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 

      string path = "/<queue-or-topic-name>/messages"; 

      var response = client.PostAsync(path, content).Result; 
      if (response.IsSuccessStatusCode) 
      { 
       // Do something 
      } 
      else 
      { 
       // Do something else 
      } 
     } 
    } 
    catch(Exception ex) 
    { 
     // Handle issue 
    } 
} 

private static string SASTokenHelper() 
{ 
    string keyName = "RootManageSharedAccessKey"; 
    string key = "<your-secret-key>"; 
    string uri = "<your-namespace>.servicebus.windows.net"; 

    int expiry = (int)DateTime.UtcNow.AddMinutes(20).Subtract(new DateTime(1970, 1, 1)).TotalSeconds; 
    string stringToSign = WebUtility.UrlEncode(uri) + "\n" + expiry.ToString(); 
    string signature = HmacSha256(key, stringToSign); 
    string token = String.Format("sr={0}&sig={1}&se={2}&skn={3}", WebUtility.UrlEncode(uri), WebUtility.UrlEncode(signature), expiry, keyName); 

    return token; 
} 

// Because Windows.Security.Cryptography.Core.MacAlgorithmNames.HmacSha256 doesn't 
// exist in WP8.1 context we need to do another implementation 
public static string HmacSha256(string key, string value) 
{ 
    var keyStrm = CryptographicBuffer.ConvertStringToBinary(key, BinaryStringEncoding.Utf8); 
    var valueStrm = CryptographicBuffer.ConvertStringToBinary(value, BinaryStringEncoding.Utf8); 

    var objMacProv = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256); 
    var hash = objMacProv.CreateHash(keyStrm); 
    hash.Append(valueStrm); 

    return CryptographicBuffer.EncodeToBase64String(hash.GetValueAndReset()); 
}