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

时间:2016-09-12 14:56:44

标签: azure .net-core azureservicebus

我正在尝试将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
  4. 然后,我转向REST。

    https://azure.microsoft.com/en-gb/documentation/articles/service-bus-brokered-tutorial-rest/是一个好的开始(虽然没有对.NET Core的RestSharp支持,并且出于某种原因,官方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读取/写入主题/订阅消息?

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分: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中发送消息:here

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

答案 2 :(得分:1)

不幸的是,截至撰写本文时,您使用服务总线的唯一选择是,如果您想使用Azure存储,可以自行推送,也可以使用其他第三方库,例如Hangfire,它具有一种类型-queue以Sql Server存储的形式。