Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Azure服务总线发布/订阅_C#_Azure_Asp.net Core_Azureservicebus - Fatal编程技术网

C# 使用Azure服务总线发布/订阅

C# 使用Azure服务总线发布/订阅,c#,azure,asp.net-core,azureservicebus,C#,Azure,Asp.net Core,Azureservicebus,我有一个微服务(WebAPI),它将消息发布到一个主题(主题a) 现在我有了另一个微服务(WebAPI),它应该订阅这个主题并根据消息进行操作 我的问题很简单:既然订阅该主题的微服务是WebApi,我应该如何做?在我的web api中,我想知道主题中何时有新消息可用。我应该通过端点轮询服务总线吗 我不确定这方面的最佳做法 我看到的所有使用控制台应用程序订阅的示例。但这不是我的情况,因为我有一个web api。无论是WebAPI还是控制台,消费者都有责任沟通和收集记录。作为一个WebAPI并不意味

我有一个微服务(WebAPI),它将消息发布到一个主题(主题a)

现在我有了另一个微服务(WebAPI),它应该订阅这个主题并根据消息进行操作

我的问题很简单:既然订阅该主题的微服务是WebApi,我应该如何做?在我的web api中,我想知道主题中何时有新消息可用。我应该通过端点轮询服务总线吗

我不确定这方面的最佳做法


我看到的所有使用控制台应用程序订阅的示例。但这不是我的情况,因为我有一个web api。

无论是
WebAPI
还是
控制台
,消费者都有责任沟通和收集记录。作为一个WebAPI并不意味着它应该只有公共端点。典型的WebAPI可能具有公共端点(用于外部世界),也可能具有私有端点(用于内部通信),或者两者兼有。私有端点的职责可能是从服务数据存储读取数据,通过适配器服务使用外部服务等。在您的情况下,在初始化WebAPI时,您可能希望创建一个使用者对象,并开始读取数据并按需处理。希望对您有所帮助。

您可以在Web作业或后台任务中进行轮询。但是内置的方法是通过主题触发,或者通过。

有不同的方法

1。使用

这样就可以创建两个应用程序。您可以使用标准的web api,并单独创建一个Azure函数来处理队列中的消息。这种方法有很多好处,其中之一是隔离处理队列的代码,因此如果有很多消息,它不会影响API的性能

2。在web应用程序中使用

这里的想法是API应用程序在后台处理队列消息。这样做的好处是,您只有一个应用程序可以完成所有工作,例如,维护起来更简单。它的缺点是大量的消息流入会减慢API的速度


(注意,在上面的链接中,查找使用队列中的消息的情况,以便在后台进行监听。Inside Method
StartSync

您可以注册消息处理器

  queueClient.RegisterMessageHandler(ProcessMessagesAsync, messageHandlerOptions)

StopAsync
上,您可以停止处理消息并关闭客户端。

@DavidBrowneMicrosoft:谢谢您的回答。只要web api在运行,web作业或后台任务是否会轮询?只要您有适当的应用程序服务计划,您就可以使您的应用程序始终处于打开状态。请参阅例如@DavidBrowneMicrosoft:但如果我运行web api在本地,backgroundworker是否总是在web api运行时轮询服务总线?我不明白这个问题。@Bryan取决于您如何配置webjob,当在本地运行时,它将根据需要轮询。您可以通过单击.exe在本地运行它,也可以在visual studio中调试它(如果您将它设置为启动程序p)roject。不知道你的解决方案是什么样子有点难知道。谢谢你的回答!如果你想在订阅该主题时立即获得消息,你会如何解决我的问题?@Bryan,Polling@Bryan,QueueBackgroundWorkItem是最理想的,因为您可以选择提供canc呼叫令牌。当您的服务停止时,您可以使用此取消令牌取消轮询操作。您会在BackgroundService中使用此令牌吗?@Bryan,QueueBackgroundWorkItem就像一个任务,可以在您的服务启动和运行时在后台运行。我希望这就是您所追求的。您可以在此处找到更多信息