C# 如何使用Azure函数将数据发送到服务总线主题?

C# 如何使用Azure函数将数据发送到服务总线主题?,c#,.net,azure,azure-functions,azureservicebus,C#,.net,Azure,Azure Functions,Azureservicebus,我这里有默认的基于C#的HTTP触发器,我希望将数据“Hello Name”发送到服务总线主题(已经创建)。我在门户网站上编码 如何进行it服务总线输出绑定 这是行不通的。有什么帮助吗 -缺少处理服务总线的参考 -如何定义服务总线的连接?Functions.json在哪里 -如何向服务总线发送消息 //This FunctionApp get triggered by HTTP and send message to Azure Service Bus using System; using

我这里有默认的基于C#的HTTP触发器,我希望将数据“Hello Name”发送到服务总线主题(已经创建)。我在门户网站上编码

如何进行it服务总线输出绑定

这是行不通的。有什么帮助吗

-缺少处理服务总线的参考

-如何定义服务总线的连接?Functions.json在哪里

-如何向服务总线发送消息

//This FunctionApp get triggered by HTTP and send message to Azure Service Bus

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace Company.Function

{
    public static class HttpTriggerCSharp1
{
    [FunctionName("HttpTriggerCSharp1")]
    [return: ServiceBus("myqueue", Connection = "ServiceBusConnection")] // I added this for SB Output. Where to define.

    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)

    {
        log.LogInformation("C# HTTP trigger function processed a request.");
        string name = req.Query["name"];
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;
        string responseMessage = string.IsNullOrEmpty(name)
            ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
            : $"Hello, {name}. This HTTP triggered function executed successfully.";
        return new OkObjectResult(responseMessage);
        // I added this for SB Output
        return responseMessage;
    }
}
//此FunctionApp由HTTP触发并将消息发送到Azure服务总线
使用制度;
使用System.IO;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.Azure.WebJobs;
使用Microsoft.Azure.WebJobs.Extensions.Http;
使用Microsoft.AspNetCore.Http;
使用Microsoft.Extensions.Logging;
使用Newtonsoft.Json;
名称空间Company.Function
{
公共静态类HttpTriggerCSharp1
{
[函数名(“HttpTriggerCSharp1”)]
[return:ServiceBus(“myqueue”,Connection=“ServiceBusConnection”)]//我为SB输出添加了这个。在哪里定义。
公共静态异步任务运行(
[HttpTrigger(AuthorizationLevel.Anonymous,“get”,“post”,Route=null)]HttpRequest请求,
ILogger日志)
{
LogInformation(“C#HTTP触发器函数处理了一个请求。”);
字符串名称=请求查询[“名称”];
string requestBody=等待新的StreamReader(req.Body).ReadToEndAsync();
动态数据=JsonConvert.DeserializeObject(requestBody);
名称=名称??数据?.name;
string responseMessage=string.IsNullOrEmpty(名称)
?“此HTTP触发的函数已成功执行。请在查询字符串或请求正文中为个性化响应传递名称。”
:$“您好,{name}。此HTTP触发的函数已成功执行。”;
返回新的OkObjectResult(responseMessage);
//我为某人添加了这个输出
返回响应消息;
}
}

}

确保首先安装NuGet软件包。然后确保您正在项目中使用它:

using Microsoft.Azure.WebJobs.Extensions.ServiceBus;
确保清理并构建项目,以确保没有错误

然后,您需要确保在
local.settings.json
文件中有一个
“ServiceBusConnection”
连接字符串:

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "ServiceBusConnection": "Endpoint=sb://...",
  }
}
如果您转到Azure门户->服务总线命名空间->共享访问策略->RootManageSharedAccessKey->主连接字符串,则可以获得该名称。将此连接字符串复制并粘贴到
“ServiceBusConnection”
中。您还可以使用辅助连接字符串

注意:服务总线队列/主题也具有共享访问策略。因此,如果您不想使用Service bus命名空间级别的访问策略,可以在队列/主题级别创建一个访问策略,这样您的函数应用程序只能访问命名空间中定义的队列/主题


此外,如果您决定发布功能应用程序,则需要确保为
的“ServiceBusConnection”
创建配置应用程序设置,因为
local.settings.json
仅用于本地测试

首先,有两个绑定将数据发送到服务总线。首先,在安装两个软件包Microsoft.Azure.WebJobs.Extensions.ServiceBus和WindowsAzure.ServiceBus之后,使用
返回
绑定,您将能够发送数据。您无法执行此操作,因为您的函数类型是
IActionResult
,并且您正在尝试返回
string
(responseMessage)

因此,如果要发送整个
响应消息
,只需
返回新的OkObjectResult(响应消息),它将工作。结果如下图所示

如果您想使用
返回响应消息
应该将方法类型更改为string,它将是
公共静态异步任务RunAsync
,结果如下

另一个绑定,您可以参考下面的代码或此

如何定义服务总线的连接?Functions.json在哪里

在本地,您应该在
local.settings.jon
中定义连接,您可以在连接中使用任何名称,然后在绑定
connection
中,值应该是您在json文件中设置的名称。由于您使用的是c#,因此无法修改
function.json
文件,调试文件夹中将有一个function.json文件。因此,您只能更改代码中的绑定


希望这能对您有所帮助,如果您还有其他问题,请随时告诉我。

看看这个例子。这更清楚。您在应用程序设置中定义了connectionstring,在名为
ServiceBusConnection
的设置中,我复制了示例和“return:ServiceBus”导致错误:“找不到类型或命名空间名称'ServiceBusAttribute'(是否缺少using指令或程序集引用?[FunctionsHttpTriggerCodeNet]csharp(CS0246)找不到类型或命名空间名称“ServiceBus”(是否缺少using指令或程序集引用?[FunctionsHttpTriggerCodeNet]csharp(CS0246)”请参见我的示例集合中的。有一个队列触发函数,但机制与输出相同。还有一个示例local.settings.json,其中包含连接字符串,您在代码中在何处定义“connection=”queueconstring?它是从Azure portal直接复制和粘贴的吗?请查看我在上面链接的示例repo中的local.settings.json中的文件(该文件用于本地调试)我已在VS代码的终端中运行:PS C:\Azure\Azure sandbox\FunctionsHttpTriggerCodeNet>安装程序包Microsoft.Azure.WebJobs.Extensions.ServiceBus-Version 4.1.1安装程序包:找不到与参数名称“Version”匹配的参数。因此,我目前无法获得Ser的指令或程序集引用
[FunctionName("Function1")]
        [return: ServiceBus("myqueue", Connection = "ServiceBusConnection")]
        public static async Task RunAsync(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            [ServiceBus("myqueue", Connection = "ServiceBusConnection")] MessageSender messagesQueue,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            string name = req.Query["name"];

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            dynamic data = JsonConvert.DeserializeObject(requestBody);
            name = name ?? data?.name;

            string responseMessage = string.IsNullOrEmpty(name)
                ? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
                : $"Hello, {name}. This HTTP triggered function executed successfully.";

            byte[] bytes = Encoding.ASCII.GetBytes(responseMessage);
            Message m1 = new Message(bytes);
            await messagesQueue.SendAsync(m1);

        }