如何从Azure功能向Azure Service Bus发送消息?

时间:2018-06-13 21:05:52

标签: azure azure-functions azureservicebus

我正在玩Azure功能并尝试设置管道和过滤器(模式)的复杂构造。我正在使用Azure功能。

我的出发点是HTTP触发的Azure功能。这会从请求正文中收集一些JSON,并将此消息传递给Azure Service Bus。

我必须在这里遗漏一些东西(我之前在使用控制台应用程序的RabbitMQ中做过这个)但是如何从HTTP触发的Azure功能向服务总线发布消息。

我发现了一些关于配置我的function.json的引用(无论是什么 - 我在Visual Studio中构建)。

这个输入/输出(触发/绑定)的工作原理是什么 - 我猜测这就是问题......或者??

我有第一个Azure功能,并且正在从HTTP接收数据 - 到目前为止一直很好。但是如何继续?

**更新** 仍然无法让它工作。得到这个代码,它失败了一个http500。 (它还说我需要看到og - 那个日志在哪里?)

public static class EI_WooCommerce_Hub
    {
        [FunctionName("EI_WooCommerce_Hub")]
        [return: ServiceBus("eilogging", Connection = "EIIntegrationServiceBusConnection")]
        public async static Task<string> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "EIWooCommerceHub/name/")]HttpRequestMessage req, TraceWriter log)
        {
            log.Info("Webhook triggered from: ");            
            return "Hello World to queue";
        }       
    }

**更新2 ** 这似乎是一个配置问题。在功能应用程序的应用程序设置中,我不断收到servicebus的授权错误。我使用connectionstring添加了默认的“AzureWebJobsServiceBus”设置,然后就可以了。由于某种原因,它无法获取我自己的连接字符串。

2 个答案:

答案 0 :(得分:5)

您应该使用Service Bus输出绑定。既然你提到了Visual Studio,我就假设是C#。最简单的例子如下:

[FunctionName("ServiceBusOutput")]
[return: ServiceBus("myqueue", Connection = "ServiceBusConnection")]
public static string ServiceBusOutput([HttpTrigger] dynamic input)
{
    return input.Text;
}

然后使用连接字符串将名为ServiceBusConnection的应用程序设置添加到具有队列myqueue的命名空间(或在属性构造函数中重命名)。

您可以在Azure Service Bus bindings for Azure Functions - Output中找到更多信息。

答案 1 :(得分:0)

在Visual Studio中构建时,会自动创建function.json。您所要做的就是将触发器和输出定义为函数参数的属性(请参阅此处:https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-service-bus#output

一个简约的例子:

[FunctionName("HttpTriggerCSharp")]
public static async Task<HttpResponseMessage> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequestMessage req,
    [ServiceBus("myqueue")] out string sbMessage,
    TraceWriter log)
{
    log.Info("C# HTTP trigger function processed a request.");

    // parse query parameter
    string name = req.GetQueryNameValuePairs()
        .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
        .Value;

    sbMessage = name;
}