Azure Service Bus - 主题,消息 - 使用.NET Core

问题描述 投票:11回答:3

我正在尝试将Azure Service Bus与.NET Core一起使用。显然此刻,这种情绪很糟糕。我尝试了以下路线:

  1. 官方SDK:不适用于.NET Core
  2. AMQP.Net Lite:没有(体面的)文档,没有关于创建/列出主题的管理API等。只有Service Bus示例涵盖了一小部分功能,需要您已经有一个主题,等等
  3. 反映Azure SDK(https://github.com/ppatierno/azuresblite)的AMQP.Net Lite的社区包装:不适用于.NET Core

然后,我转向REST。

https://azure.microsoft.com/en-gb/documentation/articles/service-bus-brokered-tutorial-rest/是一个很好的开始(虽然没有RestSharp支持.NET Core,并且由于某种原因,官方SDK似乎不包括REST客户端 - 没有Swagger def,没有AutoRest客户端等)。虽然这个蹩脚的示例将字符串连接到XML而不进行编码,但它涵盖了一小部分功能。

所以我决定寻找REST文档。有两个部分,“经典”REST和REST。普通的新REST不支持实际发送和接收消息(......嗯?)。我厌恶使用标有“经典”的旧技术,除非我能理解它是什么 - 当然,文档在这里没有帮助。它还使用XML和ATOM而不是JSON。我不知道为什么。

额外奖励:链接到REST API文档中的示例,例如来自https://msdn.microsoft.com/en-US/library/azure/hh780786.aspx,不再存在。

是否有任何可行的方法,任何人都可以使用Azure Service Bus和.NET Core读取/写入主题/订阅消息?

azure .net-core azureservicebus
3个回答

2
投票

.Net Core中对Azure Service Bus的支持越来越好。有一个专门的nuget包:Microsoft.Azure.ServiceBus。至于现在(2018年3月),它支持您可能需要的大多数场景,尽管存在一些差距,例如:

  • 批量接收消息
  • 检查主题/队列/订阅是否存在
  • 从代码创建新主题/队列/订阅

至于OnMessage对接收消息的支持,有一个新方法:RegisterMessageHandler,它做同样的事情。

以下是如何使用它的代码示例:

public class MessageReceiver
{
    private const string ServiceBusConnectionString = "Endpoint=sb://bialecki.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=[privateKey]";

    public void Receive()
    {
        var subscriptionClient = new SubscriptionClient(ServiceBusConnectionString, "productRatingUpdates", "sampleSubscription");

        try
        {
            subscriptionClient.RegisterMessageHandler(
                async (message, token) =>
                {
                    var messageJson = Encoding.UTF8.GetString(message.Body);
                    var updateMessage = JsonConvert.DeserializeObject<ProductRatingUpdateMessage>(messageJson);

                    Console.WriteLine($"Received message with productId: {updateMessage.ProductId}");

                    await subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
                },
                new MessageHandlerOptions(async args => Console.WriteLine(args.Exception))
                { MaxConcurrentCalls = 1, AutoComplete = false });
        }
        catch (Exception e)
        {
            Console.WriteLine("Exception: " + e.Message);
        }
    }
}

有关完整信息,请查看我的博客文章:

在.Net Core中发送消息:http://www.michalbialecki.com/2017/12/21/sending-a-azure-service-bus-message-in-asp-net-core/

在.Net Core中接收消息:http://www.michalbialecki.com/2018/02/28/receiving-messages-azure-service-bus-net-core/


1
投票

遗憾的是,截至撰写本文时,您使用服务总线的唯一选择是,如果要使用Azure存储,可以自行推送,也可以使用其他第三方库,例如Hangfire,它具有排队等级Sql Server存储的形式。

© www.soinside.com 2019 - 2024. All rights reserved.