C# 检查TopicClient是否可以正常工作

C# 检查TopicClient是否可以正常工作,c#,azure,azureservicebus,servicebus,C#,Azure,Azureservicebus,Servicebus,我正在编写C#代码,它将向Azure ServiceBus发送一条消息,因此(为了清晰起见,简化了代码): 如果可能的话,我想做的是在调用SendAsync()方法之前进行某种测试/检查,确保该方法有很好的成功机会,而不是在不成功时捕获任何和所有异常 也就是说,存在到ServiceBus的有效、开放的连接,并且它已准备好接受消息 我在网上阅读的各种文件中找不到任何关于如何做到这一点的信息 还有其他人面临过这种情况吗?谢谢虽然有一个属性IsClosedOrClosing您可以读取以验证连接是否仍然

我正在编写C#代码,它将向Azure ServiceBus发送一条消息,因此(为了清晰起见,简化了代码):

如果可能的话,我想做的是在调用
SendAsync()
方法之前进行某种测试/检查,确保该方法有很好的成功机会,而不是在不成功时捕获任何和所有异常

也就是说,存在到ServiceBus的有效、开放的连接,并且它已准备好接受消息

我在网上阅读的各种文件中找不到任何关于如何做到这一点的信息


还有其他人面临过这种情况吗?谢谢

虽然有一个属性
IsClosedOrClosing
您可以读取以验证连接是否仍然存在,但它不会消除处理异常的需要

连接可能会在中间死亡。或者你可能会被掐死。或者可能是网络故障导致超时。或者它可能是一个暂时的错误,您的代码可能会重试。有很多可能发生的事情,你需要处理这些事情


通常,您希望查看异常并确定重试是否有帮助(错误是暂时的)。虽然客户端内置了重试策略,但有时这还不够。尤其是在使用标准层时,您可能会受到限制。

谢谢Sean。我不打算处理任何异常;我只是想合理地确定这个电话会成功。这是因为我必须做一些其他的工作,然后发送一个关于它的消息。。。如果消息发送工作没有希望,我不想做这项工作(因为如果消息发送失败,这项工作将无法撤消)…您可以将其余工作作为发送任务的继续,假设您使用异步调用。这样,您就可以完全控制调用成功与否时会发生什么。同时,当您等待执行发送操作时,系统会向您保证消息将被发送,或者会因异常而失败,因此不会进行进一步的工作。除非,你在做“开火并忘记”,我建议你不要这样做。肖恩,我可能没有100%清楚地说明的是“其他工作”,信息的发送,加在一起,真的应该是一个原子事务。问题是,如果另一个任务失败,“其他工作”或消息发送都不能“回滚”或撤消……也许您不需要尝试回滚,而是可以评估幂等性和操作链。这是另一个有帮助的模式。谢谢肖恩。当然,“其他工作”和消息发送都可以被认为是幂等的——执行多次都不是问题。发件箱看起来很有用,但在这种特殊情况下,“其他工作”不是数据库更新,并且不是/不能跨国界,因此模式不能作为可能的解决方法应用,我按照建议测试IsClosedOrClosing,并尝试多次发送消息,直到消息成功或循环过期并记录错误。时间会证明这种方法是否可靠。。。
private ITopicClient topicClient
 = new TopicClient(configuration["ServiceBusEndpoint"], configuration["ServiceBusTopic"]);

// test here

await topicClient.SendAsync(messageToSend.ToString());