• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

android - 带有 Android 和 iOS 的 Azure 服务总线消息传递

[复制链接]
菜鸟教程小白 发表于 2022-12-12 15:41:43 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

目前,我的团队对 Azure 服务总线消息传递以及在 Android 和 iOS 上找到正确的客户端/协议(protocol)感到非常沮丧。

Service Bus 支持 amqp 1.0 协议(protocol)。有 Android 和 iOS 的客户端来处理 amqp 1.0 吗?

监听队列消息的其他选项是什么?

是否有任何示例应用可以在 Android 和/或 iOS 上监听来自 Azure 服务总线的消息? (不是从 2013 年开始,实际上正在工作/编译)


附加信息(与问题无关):

我们遇到的问题是:

  • 确实如此:azure 团队主要关注微软技术,主要是 Windows Phone 8 和适用于 Android 和 iOS 的 Xamarin。
  • 文档:分散主题的仙境,有时有 android 的示例,有时有 xamarin android,有时有 ios 或 xamarin。



Best Answer-推荐答案


经过近 80 小时的调查、谷歌和反复试验,我找到了从 Xamarin 发送 BrokeredMessages 的解决方案。以下代码有效:

    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 await 做起来很重要

new System.Net.Http.StreamContent(new System.IO.MemoryStream(stream.ToArray()))

否则 PostAsync 将阻塞,直到发生超时。我不确定为什么。我猜 MemoryStream 以某种方式关闭或处置,等待的同步 Context 阻塞了 PostAsync 调用。

关于android - 带有 Android 和 iOS 的 Azure 服务总线消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31165311/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap