C# 如何使用Azure函数将数据发送到服务总线主题?
我这里有默认的基于C#的HTTP触发器,我希望将数据“Hello Name”发送到服务总线主题(已经创建)。我在门户网站上编码 如何进行it服务总线输出绑定 这是行不通的。有什么帮助吗 -缺少处理服务总线的参考 -如何定义服务总线的连接?Functions.json在哪里 -如何向服务总线发送消息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
//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);
}