C# Azure Http触发器功能应用程序仅在停止并重新启动时工作

C# Azure Http触发器功能应用程序仅在停止并重新启动时工作,c#,azure,azure-functions,azureservicebus,C#,Azure,Azure Functions,Azureservicebus,我已经使用了Http触发函数应用程序,想从服务总线主题中读取消息 安装nuget-Microsoft.Azure.ServiceBus 但当我触发Http函数消息为空时,它只在第二次读取一条消息 当我停止并重新启动函数应用程序并触发它时,它第一次工作正常,因为第二次触发消息为空 为什么会有这样的行为 [FunctionName("Test")] public static async Task<IActionResult> Run(

我已经使用了Http触发函数应用程序,想从服务总线主题中读取消息

安装nuget-
Microsoft.Azure.ServiceBus

但当我触发Http函数消息为空时,它只在第二次读取一条消息

当我停止并重新启动函数应用程序并触发它时,它第一次工作正常,因为第二次触发消息为空

为什么会有这样的行为

  [FunctionName("Test")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {

            string serviceBusConnectionString = Environment.GetEnvironmentVariable("ConnectionStringSettingName");
            var messageReceiver = new MessageReceiver(serviceBusConnectionString, Environment.GetEnvironmentVariable("EntityPath"), ReceiveMode.PeekLock);

            var messages = await messageReceiver.ReceiveAsync(500, TimeSpan.FromSeconds(1));

            if (messages != null)
            {
            foreach (Message item in messages)
                    {
           // process messages and complete it.
   await messageReceiver.CompleteAsync(item.SystemProperties.LockToken);

您需要使用PeekAsync而不是ReceiveAsync

Peek将消息保留在队列中,以便它们可以由另一个进程处理,其中as receive将消息标记为正在处理,以防止多次传递。重新启动函数应用程序将回滚接收,从而将消息放回队列


当您使用一条消息时,您只能阅读一次,因此您可以看到服务总线的预期行为

我建议你考虑调整你的解决方案来解释这个问题。 很难提供具体的解决方案,因为我不知道您的全部要求,但我建议将此azure功能更改为服务总线触发功能,并让它将数据写入逻辑应用程序可以轻松查询的某个位置,例如存储帐户


第二种选择是完全放弃该功能,直接在逻辑应用程序中使用服务总线触发器。这被配置为每隔一段时间轮询一次服务总线,并将重复运行,直到在等待轮询间隔之前处理完所有消息。

我觉得您需要的是servicebusttrigger而不是http触发器-我会为您准备一个答案,在这种情况下,听起来您需要进行“查看”在消息上保留它们,而不是“接收”它们,这是为了确保没有两个处理程序获得相同的消息。您是否尝试过使用类似postman的工具对logic应用程序进行独立功能测试?如果您正在编写某种队列监控软件,以便每次调用此azure函数时,您都可以看到队列的内容,您应该使用peek,而不是完成消息。如果您试图使用这些消息,那么您应该使用receive,并且您描述的行为是预期的。在字里行间阅读听起来你应该使用逻辑应用程序中的消息,而不是使用此功能。当使用消息时,你只能阅读一次,因此你看到了服务总线的预期目标。我建议你考虑重新调整你的解决方案。我建议将此azure功能更改为服务总线触发功能,并让它将数据写入逻辑应用程序可以轻松查询的某个位置,例如存储帐户或完全删除该功能,并直接在逻辑应用程序中使用服务总线触发。哦,明白了,但目前只有一个逻辑应用程序触发该功能功能应用程序仍面临第一次读取和第二次重新启动功能应用程序之前的问题。让我试试PeekAsync
var messages = await messageReceiver.ReceiveAsync(500);

var messageReceiver = new MessageReceiver(serviceBusConnectionString, Environment.GetEnvironmentVariable("EntityPath"), ReceiveMode.ReceiveAndDelete);