EventHub Azure函数正确触发,但EventData.Body为0字节



我正在编写一个EventHub发布者(控制台应用程序(和一个将作为消费者工作的C#Azure函数。当我运行客户端时,我可以看到Function被触发,但它在eventData.Body中接收到0个字节。有人能帮我吗?我在Az函数中看到了一些关于空事件的其他类似问题。这是不同的,因为每次我发送一批10个时都会触发,但不知何故,数据被吞噬了

我的功能代码是

[FunctionName("EventHubTrigger1")]
public static async Task Run([EventHubTrigger("confighub", Connection = "EventHubName")] EventData[] events, ILogger log)
{
var exceptions = new List<Exception>();
foreach (EventData eventData in events)
{
try
{
//eventData.Body is System.ReadOnlyMemory<Byte>[0] instead of what the sender is sending
string messageBody = Encoding.UTF8.GetString(eventData.Body.ToArray());

log.LogInformation($"C# Event Hub trigger function processed a message: {messageBody}");
await Task.Yield();
}
catch (Exception e)
{

exceptions.Add(e);
}
}

if (exceptions.Count > 1)
throw new AggregateException(exceptions);
if (exceptions.Count == 1)
throw exceptions.Single();
}

发布者也很简单,在调试过程中,我可以看到EventData.BodySystem.ReadOnlyMemory<Byte>[456]

private async Task SendToHub(IEnumerable<IDomain> users)
{
await using (var producerClient = new EventHubProducerClient(_eventHubConnectionString, _eventHubName))
{
try
{
CreateBatchOptions options = new CreateBatchOptions();

options.PartitionKey = "user";
using EventDataBatch eventBatch = await producerClient.CreateBatchAsync(options);
foreach (var user in users)
{
var json = JsonSerializer.Serialize(user);

eventBatch.TryAdd(new Azure.Messaging.EventHubs.EventData(Encoding.UTF8.GetBytes(json)));
}
//During Debugging I can see that the Body is 456 bytes
await producerClient.SendAsync(eventBatch);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}

我怀疑使用两个不同版本的EventHub库的原因——发送方使用版本5,Az函数接收方使用版本4。

只需考虑发送方在接收方获得Microsoft.Azure.EventHubs.EventData时发送Azure.Messageing.EventHubs.EventData

有关从Microsoft.Azure.EventHubs.迁移到Azure.Messaging.EventHubs的详细信息,请参阅指南

尝试在发送方切换到版本4,或将函数降级为使用Microsoft.Azure.EventHubs(代码参考(:

var connectionString = "<< CONNECTION STRING FOR THE EVENT HUBS NAMESPACE >>";
var eventHubName = "<< NAME OF THE EVENT HUB >>";
var connectionStringBuilder = new EventHubsConnectionStringBuilder(connectionString){ EntityPath = eventHubName }; 
var eventHubClient = EventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());
try
{
EventData eventData = new EventData(Encoding.UTF8.GetBytes("First"));
await eventHubClient.SendAsync(eventData, "my-partition-key");
}
finally
{
await eventHubClient.CloseAsync();
}

最新更新