2

我正在构建一个 Windows Phone 应用程序,但无法使用 Microsoft.ServiceBus.Messaging.QueueClient 类。

然后我尝试使用 Azure 服务总线 REST API 进行发送,但这需要我构建一个 SAS 令牌。但要构建 SAS 令牌,我需要使用 Windows.Security.Cryptography.Core.MacAlgorithmNames.HmacSha256。此类以预先输入的形式显示,但在编译时它不存在。

如何使用发送 REST API 将消息发布到服务总线队列或主题?

4

1 回答 1

3

我将包含使用 REST API 向服务总线发送消息的完整代码,包括创建 SAS 令牌和 HmacSha256 哈希。

您需要使用您唯一的服务总线命名空间和键来更新示例,并且您可能希望将其存储在比方法中更好的地方...

如何创建 SAS 令牌记录在http://msdn.microsoft.com/library/azure/dn170477.aspxhttps://code.msdn.microsoft.com/windowsazure/Service-Bus-HTTP-Token-38f2cfc5 .

我在 Windows Phone 8.1 上从 HMACSHA256 中实现了 HmacSha256 ?

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());
}
于 2014-12-12T07:49:10.740 回答