如何使用 Azure Functions 将数据发送到服务总线主题?
How to send data to Service Bus Topic with Azure Functions?
我这里有默认的基于 C# 的 HTTP 触发器,我希望将数据 "Hello Name" 发送到服务总线主题(已创建)。我在门户网站上编码。
Service Bus输出绑定怎么做?
这是行不通的。有什么帮助吗?
-缺少处理服务总线的参考?
-如何定义服务总线的连接? 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;
}
}
}
确保先安装 Microsoft.Azure.WebJobs.Extensions.ServiceBus NuGet 包。然后确保您在项目中使用它:
using Microsoft.Azure.WebJobs.Extensions.ServiceBus;
确保清理并构建项目以确保没有错误。
然后您需要确保您的 local.settings.json
文件中有一个 "ServiceBusConnection"
连接字符串:
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"ServiceBusConnection": "Endpoint=sb://...",
}
}
如果您转到 Azure 门户 -> 服务总线命名空间 -> 共享访问策略 -> RootManageSharedAccessKey -> 主连接字符串,您可以获得。将此连接字符串复制并粘贴到 "ServiceBusConnection"
中。您也可以使用 辅助连接字符串 。
注意: 服务总线 queues/topics 也有共享访问策略。因此,如果您不想使用服务总线命名空间级别的访问策略,您可以在 queue/topic 级别创建一个,这样您的函数应用程序只能访问命名空间中定义的 queue/topic。
此外,如果您决定发布函数应用程序,则需要确保为 "ServiceBusConnection"
创建配置应用程序设置,因为 local.settings.json
仅用于本地测试。
首先,有两个绑定将数据发送到服务总线。首先是你展示的,使用return
绑定,安装两个包Microsoft.Azure.WebJobs.Extensions.ServiceBus
和WindowsAzure.ServiceBus
后,你就可以发送数据了。你不能这样做,因为你的函数类型是 IActionResult
并且你正在尝试 return string
(responseMessage)。
因此,如果您想发送整个 responseMessage
,只需 return new OkObjectResult(responseMessage);
,它就可以了。结果如下图所示。
如果你想使用 return responseMessage;
应该将你的方法类型更改为字符串,它将是 public static async Task<string> RunAsync
结果如下。
另一个绑定你可以参考下面的代码或者这个 sample.
[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);
}
How to define Connection of service bus? Where is Functions.json
在本地你应该在 local.settings.jon
中定义连接,你可以使用连接的任何名称,然后在绑定中 Connection
值应该是你在 json 文件。并且由于你使用的是c#,所以你无法修改function.json
文件,调试文件夹中会有一个function.json文件。所以你只能在代码中更改绑定。
希望对您有所帮助,如果您还有其他问题,请随时告诉我。
我这里有默认的基于 C# 的 HTTP 触发器,我希望将数据 "Hello Name" 发送到服务总线主题(已创建)。我在门户网站上编码。
Service Bus输出绑定怎么做?
这是行不通的。有什么帮助吗?
-缺少处理服务总线的参考?
-如何定义服务总线的连接? 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;
}
}
}
确保先安装 Microsoft.Azure.WebJobs.Extensions.ServiceBus NuGet 包。然后确保您在项目中使用它:
using Microsoft.Azure.WebJobs.Extensions.ServiceBus;
确保清理并构建项目以确保没有错误。
然后您需要确保您的 local.settings.json
文件中有一个 "ServiceBusConnection"
连接字符串:
{
"IsEncrypted": false,
"Values": {
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"ServiceBusConnection": "Endpoint=sb://...",
}
}
如果您转到 Azure 门户 -> 服务总线命名空间 -> 共享访问策略 -> RootManageSharedAccessKey -> 主连接字符串,您可以获得。将此连接字符串复制并粘贴到 "ServiceBusConnection"
中。您也可以使用 辅助连接字符串 。
注意: 服务总线 queues/topics 也有共享访问策略。因此,如果您不想使用服务总线命名空间级别的访问策略,您可以在 queue/topic 级别创建一个,这样您的函数应用程序只能访问命名空间中定义的 queue/topic。
此外,如果您决定发布函数应用程序,则需要确保为 "ServiceBusConnection"
创建配置应用程序设置,因为 local.settings.json
仅用于本地测试。
首先,有两个绑定将数据发送到服务总线。首先是你展示的,使用return
绑定,安装两个包Microsoft.Azure.WebJobs.Extensions.ServiceBus
和WindowsAzure.ServiceBus
后,你就可以发送数据了。你不能这样做,因为你的函数类型是 IActionResult
并且你正在尝试 return string
(responseMessage)。
因此,如果您想发送整个 responseMessage
,只需 return new OkObjectResult(responseMessage);
,它就可以了。结果如下图所示。
如果你想使用 return responseMessage;
应该将你的方法类型更改为字符串,它将是 public static async Task<string> RunAsync
结果如下。
另一个绑定你可以参考下面的代码或者这个 sample.
[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);
}
How to define Connection of service bus? Where is Functions.json
在本地你应该在 local.settings.jon
中定义连接,你可以使用连接的任何名称,然后在绑定中 Connection
值应该是你在 json 文件。并且由于你使用的是c#,所以你无法修改function.json
文件,调试文件夹中会有一个function.json文件。所以你只能在代码中更改绑定。
希望对您有所帮助,如果您还有其他问题,请随时告诉我。