Я включу полный код, который отправит сообщение на служебную шину с использованием 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());
}