【问题标题】:Azure ServiceBus from Xamarin Forms PCL来自 Xamarin Forms PCL 的 Azure ServiceBus
【发布时间】:2016-10-05 00:37:53
【问题描述】:

如何通过 Azure 服务总线从 Xamarin Forms PCL 完成代理消息传递...是否有 SDK、库或插件?如果有办法手动滚动代理消息,我想它可以通过 HttpClient 和 REST API 来完成......

【问题讨论】:

  • 您的目标是 Windows、Android 还是 iOS?
  • 目前仅针对 iOS 和 Android。

标签: xamarin.forms azureservicebus


【解决方案1】:

我终于有了一种从 Xamarin PCL 向 Azure 服务总线队列发布消息的工作方法!这样做的方法是通过 HttpClient。

使解决方案难以捉摸的陷阱:

  • Microsoft.ServiceBus.Messaging 的 nuget 包会很高兴地安装,但不会暴露于可移植类。

  • WebClient 示例比比皆是,但在 PCL!

  • PCL 没有用于共享访问签名的 HMACSHA256 的本机加密 令牌。从 nuget 获取 PCLCrypto 包。
  • 一些文档说 Content-Type 的请求标头:application/atom+xml;type=entry;charset=utf-8 和 BrokerProerties 是必需的。不是这样!
  • 要发帖的路径是:BaseServiceBusAddress + queue + "/messages"

    public const string ServiceBusNamespace = [YOUR SERVICEBUS NAMESPACE];
    
    public const string BaseServiceBusAddress = "https://" + ServiceBusNamespace + ".servicebus.windows.net/";
    
    /// <summary>
    /// The get shared access signature token.
    /// </summary>
    /// <param name="sasKeyName">
    /// The shared access signature key name.
    /// </param>
    /// <param name="sasKeyValue">
    /// The shared access signature key value.
    /// </param>
    /// <returns>
    /// The <see cref="string"/>.
    /// </returns>
    public static string GetSasToken(string sasKeyName, string sasKeyValue)
    {
        var expiry = GetExpiry();
        var stringToSign = WebUtility.UrlEncode(BaseServiceBusAddress ) + "\n" + expiry;
    
        var algorithm = WinRTCrypto.MacAlgorithmProvider.OpenAlgorithm(MacAlgorithm.HmacSha256);
        var hasher = algorithm.CreateHash(Encoding.UTF8.GetBytes(sasKeyValue));
        hasher.Append(Encoding.UTF8.GetBytes(stringToSign));
        var mac = hasher.GetValueAndReset();
        var signature = Convert.ToBase64String(mac);
    
        var sasToken = string.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}", WebUtility.UrlEncode(baseAddress), WebUtility.UrlEncode(signature), expiry, sasKeyName);
        return sasToken;
    }
    
    /// <summary>
    /// Posts an order data transfer object to queue.
    /// </summary>
    /// <param name="orderDto">
    /// The order data transfer object.
    /// </param>
    /// <param name="serviceBusNamespace">
    /// The service bus namespace.
    /// </param>
    /// <param name="sasKeyName">
    /// The shared access signature key name.
    /// </param>
    /// <param name="sasKey">
    /// The shared access signature key.
    /// </param>
    /// <param name="queue">
    /// The queue.
    /// </param>
    /// <returns>
    /// The <see cref="Task"/>.
    /// </returns>
    public static async Task<HttpResponseMessage> PostOrderDtoToQueue(OrderDto orderDto, string serviceBusNamespace, string sasKeyName, string sasKey, string queue)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(BaseServiceBusAddress);
            client.DefaultRequestHeaders.Accept.Clear();
    
            var token = GetSasToken(sasKeyName, sasKey);
            client.DefaultRequestHeaders.Add("Authorization", token);
    
            HttpContent content = new StringContent(JsonConvert.SerializeObject(orderDto), Encoding.UTF8);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    
            var path = BaseServiceBusAddress + queue + "/messages";
    
            return await client.PostAsync(path, content);
        }
    }
    
    /// <summary>
    ///     Gets the expiry for a shared access signature token
    /// </summary>
    /// <returns>
    ///     The <see cref="string" /> expiry.
    /// </returns>
    private static string GetExpiry()
    {
        var sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
        return Convert.ToString((int)sinceEpoch.TotalSeconds + 3600);
    }
    

    }

【讨论】:

  • 嗨,你能分享你的进口/使用吗?
  • @masoodelsad:使用 Newtonsoft.Json;使用 PCLCrypto;使用系统;使用 System.Globalization;使用 System.Net;使用 System.Net.Http;使用 System.Net.Http.Headers;使用 System.Text;使用 System.Threading.Tasks;
猜你喜欢
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多