首页 > 解决方案 > 使用 ServiceBusTrigger 的 Azure 函数在 Xamarin.Android 应用程序中不起作用

问题描述

当我的 Android 应用程序调用我的 Azure 函数时,它不会触发。

测试:

以下测试通过 ServiceBusTrigger 成功触发 Azure 函数:

[<Fact>]
let ``Publish message assigned to servicebus topic``() =

    // Setup
    let connectionstring = ConfigurationManager.ConnectionStrings.["servicebus_testEnv"].ConnectionString

    // Test
    async {

        let client  = TopicClient(connectionstring, "Topic.courier-subscribed")
        let data    = "test_data"
        let message = Message(Encoding.UTF8.GetBytes(data))

        do! client.SendAsync(message) |> Async.AwaitTask
        do! client.CloseAsync()       |> Async.AwaitTask
    }

问题:

但是,当我将代码插入我的 Xamarin Android 应用程序时,Azure 函数永远不会被触发。

相反,我只观察到以下错误:

System.TimeoutException:“对象 session5 的操作未在分配的时间 00:00:49.9480520 内完成。”

Xamarin.Android:

这是我的 Xamarin Android 应用程序中的代码:

let subscribe : Subscribe =
    fun request ->

        async {

            let body = {
                Courier   = request.Courier
                Location  = request.Location
                Timestamp = DateTime.Now
            }

            try
                let connectionstring = QueueTopic.Instance.ConnectionString
                let client  = TopicClient(connectionstring, "Topic.courier-subscribed")
                let json    = JsonConvert.SerializeObject(body)
                let message = Message(Encoding.UTF8.GetBytes(json))

                do! client.SendAsync(message) |> Async.AwaitTask
                do! client.CloseAsync()       |> Async.AwaitTask

                return Ok body
         }

Azure 函数(ServiceBusTrigger):

public static class SubscribedFn
{
    [FunctionName(nameof(SubscribedFn))]
    public static async Task Run([ServiceBusTrigger("Topic.courier-subscribed", "Subscription.all-messages", Connection= "ServiceBusConnectionKey")]
                                  string json, ILogger log)
    {
        ... // NEVER INVOKED
    }

笔记:

  1. 我已验证连接字符串与我的自动化测试相同。

  2. 自动化测试每次都会通过 ServiceBusTrigger 触发 Azure 功能。

  3. 我已验证我在两个客户端中都将 JSON 作为有效负载发送

标签: azurexamarin.androidazure-functionsazureservicebus

解决方案


您的设备上可能存在网络问题。ServiceBus 默认使用 AMQP 协议。在大多数情况下,您需要在传出连接上打开端口 5671 和 5672。

对于您的 Xamarin 应用程序,我建议附加;TransportType=AmqpWebSockets到您的连接字符串,看看是否有帮助。

端点=sb://xxxx.servicebus.windows.net/;SharedAccessKeyName=xxxx;SharedAccessKey=xxxxx;TransportType=AmqpWebSockets


推荐阅读