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

C# EventHub Azure函数正确触发,但EventData.Body为0字节,c#,azure-functions,azure-eventhub,C#,Azure Functions,Azure Eventhub,我正在编写一个EventHub发布程序(控制台应用程序)和一个C#Azure函数,它将作为消费者使用。当我运行客户端时,我可以看到函数被触发,但它在eventData.Body中接收到0字节。有人能帮我吗?我已经看到了一些关于Az函数中接收的空事件的类似问题。这是不同的,因为每次我发送一批10个触发器时,触发器都会被触发,但不知何故,数据被消耗掉了 我的功能代码是 [FunctionName("EventHubTrigger1")] public static

我正在编写一个EventHub发布程序(控制台应用程序)和一个C#Azure函数,它将作为消费者使用。当我运行客户端时,我可以看到函数被触发,但它在
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();
    }

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

只需考虑当接收方获得Microsoft.Azure.EventHubs.EventData时,发送方发送Azure.Messaging.EventHubs.EventData。

有关详细信息,请参阅

尝试在发件人端切换到版本4,或降级该功能以使用Microsoft.Azure.EventHubs():

var connectionString=“>”;
var eventHubName=“>”;
var connectionStringBuilder=new EventHubsConnectionStringBuilder(connectionString){EntityPath=eventHubName};
var eventHubClient=eventHubClient.CreateFromConnectionString(connectionStringBuilder.ToString());
尝试
{
EventData EventData=neweventdata(Encoding.UTF8.GetBytes(“First”));
等待eventHubClient.SendAsync(eventData,“我的分区密钥”);
}
最后
{
等待eventHubClient.CloseAsync();
}

我正在两侧使用Azure.Messaging.EventHubs 5.2。Azure.Messaging.EventHubs上没有针对它的4.0版本。您是否建议我需要转到发件人端的旧库Microsoft.Azure.EventHubs?您的回答让我想到只发送普通字符串,而不是json。这开始在我的Az函数上抛出错误,说我需要将EventData[]更改为string[]。当我这么做的时候,我得到了日志中的“第一条消息”。然后,我在eventData中发送json,并以字符串形式接收,这就成功了!!!谢谢你帮我找到答案没问题-我很高兴它现在能工作;)版本4(
Microsoft.Azure.EventHubs
)和版本5(
Azure.Messaging.EventHubs
)兼容;一个版本发布的事件可以被另一个版本使用。我们建议使用
Azure.Messaging.EventHubs
进行开发。还值得注意的是,Azure函数绑定正在升级为使用
Azure.Messaging.EventHubs
。我正在使用
Azure.Messaging.EventHubs
。令人惊讶的是,我在VS代码中创建了另一个Az函数,它在不更改为字符串[]的情况下工作!!我昨天发布的代码是使用VS2019创建的。我猜工具中有什么东西导致了EventData.Body对于我昨天使用的工具是0字节。我将字符串[]交换回旧项目上的EventData,并从VS代码运行它,但仍然出现相同的错误,而新项目的工作方式非常好。我会尝试找出项目之间的差异,如果我找到了,会发布并更新。
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);
            }
        }

    }
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();
}