我在.NET 4.8中有一个Azure函数(由于WCF而卡在这个框架上)。
该函数正在尝试使用
ServiceBusTrigger
从 Azure Servicebus 接收消息。
我遇到了一个例外:
无法将输入参数“message”从类型“System.String”转换为类型“Azure.Messaging.ServiceBus.ServiceBusReceivedMessage”
我的假设是我的函数正在“进程内”运行而不是“隔离”运行,因为它尝试将第一个参数映射为字符串而不是
ServiceBusReceivedMessage
- 这是正确的吗?
但我不明白为什么它会在进程中运行。
在我的
.csproj
我有“Exe”
<TargetFramework>net48</TargetFramework>
<AzureFunctionsVersion>v4</AzureFunctionsVersion>
<OutputType>Exe</OutputType>
我引用以下软件包:
<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.17.5" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.ServiceBus" Version="5.18.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Timer" Version="4.0.1" />
<PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.10.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.7.0" />
我的
host.json
看起来像这样:
{
"version": "2.0"
}
我部署的功能具有以下应用程序设置:
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~4",
"slotSetting": false
},
{
"name": "FUNCTIONS_WORKER_RUNTIME",
"value": "dotnet-isolated",
"slotSetting": false
}
我的实现装饰有:
[Function("myspecialfunction")]
public async Task Run([ServiceBusTrigger("myspecialqueue", Connection = "<secret>")] ServiceBusReceivedMessage message, ServiceBusMessageActions messageActions)
可能出了什么问题?
无法将输入参数“message”从“System.String”类型转换为“Azure.Messaging.ServiceBus.ServiceBusReceivedMessage”类型
您收到此错误是因为您无法将服务总线消息直接转换为字符串。
要将
ServiceBusReceivedMessage
- 转换为 String
,您需要使用 .ToString()
方法。
这对我有用。
using System;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.Logging;
namespace FunctionApp5
{
public class Function1
{
private readonly ILogger<Function1> _logger;
public Function1(ILogger<Function1> logger)
{
_logger = logger;
}
[Function("Function1")]
public async Task Run(
[ServiceBusTrigger("myqueue", Connection = "SB_conn")]
ServiceBusReceivedMessage message,
ServiceBusMessageActions messageActions)
{
_logger.LogInformation("Message ID: {id}", message.MessageId);
_logger.LogInformation("Message Body: {body}", message.Body);
_logger.LogInformation("Message Content-Type: {contentType}", message.ContentType);
String stringmessage = message.Body.ToString();
Console.WriteLine($"Type of stringmessage: {stringmessage.GetType()}");
Console.WriteLine($"Type of message: {message.GetType()}");
Console.WriteLine($"convert to string message: {stringmessage}");
await messageActions.CompleteMessageAsync(message);
}
}
}
OUTPUT
: