ram*_*den 5 sdk android azure ios
目前,我的团队对 Azure 服务总线消息传递以及在 Android 和 iOS 上寻找正确的客户端/协议感到非常沮丧。
服务总线支持 amqp 1.0 协议。Android 和 iOS 是否有客户端可以处理 amqp 1.0?
监听队列消息的其他选项有哪些?
是否有任何示例应用程序可以在 Android 和/或 iOS 上侦听来自 Azure 服务总线的消息?(不是 2013 年的,实际上正在工作/编译)
侧面信息(与问题不严格相关):
我们遇到的问题是:
小智 3
经过近 80 小时的调查、谷歌和反复试验,我找到了BrokeredMessages从 Xamarin 发送的解决方案。以下代码有效:
    private const String topic = "mytopic";
    private const String keyName = "RootManageSharedAccessKey";
    private const String sharedAccessKey = "myAccessKey";
    private const String baseAddress = "myaddress.servicebus.windows.net";
    private async static void SendMessage(String baseAddress, string queueName, string body)
    {
        string fullAddress = $"{baseAddress}{queueName}/messages";
        HttpClient client = Program.CreateHttpClient();
        client.DefaultRequestHeaders.TryAddWithoutValidation("BrokerProperties", @"{ ""MessageId"": """ + Guid.NewGuid().ToString() + @"""}");
        MemoryStream stream = new MemoryStream();
        DataContractSerializer s = new DataContractSerializer(typeof(string));
        XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(stream);
        writer.WriteStartDocument();
        s.WriteStartObject(writer, body);
        s.WriteObjectContent(writer, body);
        s.WriteEndObject(writer);
        writer.Flush();
        stream.Position = 0;
        var response = await client.PostAsync(fullAddress, new System.Net.Http.StreamContent(new System.IO.MemoryStream(stream.ToArray())));
    }
    private static HttpClient CreateHttpClient()
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/atom+xml;type=entry;charset=utf-8");
        string token = GetSASToken(baseAddress, Program.keyName, Program.sharedAccessKey);
        client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", token);
        return client;
    }
    private static string GetSASToken(string baseAddress, string SASKeyName, string SASKeyValue)
    {
        TimeSpan fromEpochStart = DateTime.UtcNow - new DateTime(1970, 1, 1);
        string expiry = Convert.ToString((int)fromEpochStart.TotalSeconds + 3600);
        string stringToSign = WebUtility.UrlEncode(baseAddress) + "\n" + expiry;
        HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(SASKeyValue));
        string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));
        string sasToken = String.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",
              WebUtility.UrlEncode(baseAddress), WebUtility.UrlEncode(signature), expiry, SASKeyName);
        return sasToken;
    }
提到使用 async wait 是非常重要的
new System.Net.Http.StreamContent(new System.IO.MemoryStream(stream.ToArray()))
否则PostAsync将阻塞直到超时。我不太确定为什么。我猜想它MemoryStream已以某种方式关闭或处置,并且Context等待的同步阻止了PostAsync呼叫。
| 归档时间: | 
 | 
| 查看次数: | 1885 次 | 
| 最近记录: |