Azure Service Bus(三)在 .NET Core Web 應用程式傳送ServiceBus Queue

Grant_Allen發表於2021-01-03

一,引言

  在之前上一篇講解到 Azure ServiceBus Queue 中,我們實地的演示了在控制檯中如何操作ServiceBus Queue ,使用 Azure.Messgae.Service 的依賴包完成 Message 的接收/傳送,今天我們繼續探究 ServiceBus Queue,如何利用 Microsoft.Azure.ServiceBus 以來完成訊息的傳送。

--------------------我是分割線--------------------

Azure ServiceBus 系列:

1,Azure Service Bus(一)入門簡介

2,Azure Service Bus(二)在NET Core 控制檯中如何操作 ServiceBus Queue

3,Azure Service Bus(三)在 .NET Core Web 應用程式傳送ServiceBus Queue

二,正文

1,建立ServiceBus Queue

Azure Portal 點選 “create a resource”,輸入 “Service Bus” 搜尋,並且進行建立。

Resource group 選擇:“Web_Test_SB_RG”

Namespace name:“cnbateblogweb”

Loaction:“East Asia”

Pricing tier:“Basic”

點選 “Review + create” 進行建立預校驗。

校驗完成後,點選 “Create” 進行建立

建立完成後,點選 “Go to resource” 跳轉到建立好的資源

最後,選擇 “Entities=》Queue”,點選 “+ Queue” 新增 ServiceBus Queue

建立 ServiceBus Queue 輸入

Name:“cnbateblogweb_queue”

其他引數選擇預設,點選 “Create” 進行建立

建立完成後,我們可以在列表中檢視到剛剛建立的名字叫 “cnbateblogweb_queue” 的 Queue 的資訊了

2,.NET Core Web MVC 新增對 ServiceBus Queue 的訊息的傳送

2.1,建立Web專案,新增對 "ServiceBus Queue“ 的依賴包

接下來就是建立 Web 專案,點選 “ASP.NET Core Web 應用程式”,並命名為 “Azure.ServiceBus.Web”,我這裡選擇的目標框架為 “.NET 5.0”

專案建立完成之後,需要新增 Azure ServiceBus 的引用 “Microsoft.Azure.ServiceBus

使用程式包管理控制檯進行安裝

Install-Package Microsoft.Azure.ServiceBus -Version 5.1.0

2.2,建立 ServiceBusQueueSerivice

我們需要建立 ServiceBusQueueSerivice 負責建立與ServiceBus 連線並且傳送資訊

IServiceBusQueueService

public interface IServiceBusQueueService
    {
        Task SendMessageAsync(Message msg);
    }

 ServiceBusQueueService

public class ServiceBusQueueService : IServiceBusQueueService
    {
        private readonly AzureServiceBus.IQueueClient _queueClient;

        public ServiceBusQueueService(AzureServiceBus.QueueClient queueClient)
        {
            _queueClient = queueClient;
        }

        public async Task SendMessageAsync(Message msg)
        {
            try
            {
                // Serialize data model and create message.
                string messageBody = JsonSerializer.Serialize(msg);
                // create a message that we can send. UTF-8 encoding is used when providing a string.
                var message = new AzureServiceBus.Message(Encoding.UTF8.GetBytes(messageBody));

                /// send the message
                await _queueClient.SendAsync(message);
            }
            catch (Exception ex)
            {
                
            }
        }
    }

2.3,建立 ServiceBusQueueController 

通過頁面文字輸入的表單需要提交內容,再將需要傳送的Message 傳送到 ServiceBus 中

ServiceBusQueueController

public class ServiceBusQueueController : Controller
    {
        private IServiceBusQueueService _serviceBusQueueService;

        public ServiceBusQueueController(IServiceBusQueueService serviceBusQueueService)
        {
            _serviceBusQueueService = serviceBusQueueService;
        }

        public IActionResult Index(string msg)
        {
            ViewBag.Message = string.Empty;
            if (!string.IsNullOrEmpty(msg))
                ViewBag.Message = msg;
            return View();
        }

        [Route("ServiceBusQueue/Send")]
        [HttpPost()]
        public async Task<IActionResult> SendMessage(IFormCollection collection)
        {
            var msg = new Message
            {
                Id=1,
                Title = collection["Title"],
                Content = collection["Content"],
                CreateTime=DateTime.Now
            };
            await _serviceBusQueueService.SendMessageAsync(msg);
            return RedirectToAction("Index", "ServiceBusQueue",new {msg= " Success!" });
        }
    }

使用者在頁面上提交需要傳送的 Message 的內容

@model Azure.ServiceBus.Web.Models.Message

@{
    ViewData["Title"] = "ServiceBusQueue Page";
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>@ViewData["Title"]</title>
</head>
<body>

    <h4>ServiceBusQueue Add Message:<span class="text-success">@ViewBag.Message</span></h4>

    <hr />
    <div class="row">
        <div class="col-md-4">
            <form asp-action="Send">
                <div asp-validation-summary="ModelOnly" class="text-danger"></div>
                <div class="form-group">
                    <label asp-for="Title" class="control-label"></label>
                    <input asp-for="Title" class="form-control" />
                    <span asp-validation-for="Title" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="Content" class="control-label"></label>
                    <input asp-for="Content" class="form-control" />
                    <span asp-validation-for="Content" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <input type="submit" value="Send" class="btn btn-primary" />
                </div>
            </form>
        </div>
    </div>
</body>
</html>

2.4,依賴注入 Service,Appsettings 配置等

Startup.cs 的ConfigureService 方法

services.AddSingleton(new Appsettings(Env.ContentRootPath));

services.AddSingleton<AzureServiceBus.QueueClient>(new AzureServiceBus.QueueClient(Appsettings.app("ServiceBus", "PrimaryConnectionString"), Appsettings.app("ServiceBus", "QueueName")));

services.AddSingleton<IServiceBusQueueService, ServiceBusQueueService>();

Appsettings.cs

/// <summary>
    /// appsettings.json操作類
    /// </summary>
    public class Appsettings
    {
        static IConfiguration Configuration { get; set; }
        static string contentPath { get; set; }

        public Appsettings(string contentPath)
        {
            string Path = "appsettings.json";


            //如果你把配置檔案 是 根據環境變數來分開了,可以這樣寫
            //string Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json";

            //var contentPath = env.ContentRootPath;
            Configuration = new ConfigurationBuilder()
               .SetBasePath(contentPath)
               .Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true })//這樣的話,可以直接讀目錄裡的json檔案,而不是 bin 資料夾下的,所以不用修改複製屬性
               .Build();
        }

        /// <summary>
        /// 封裝要操作的字元
        /// </summary>
        /// <param name="sections"></param>
        /// <returns></returns>
        public static string app(params string[] sections)
        {
            try
            {
                var val = string.Empty;
                for (int i = 0; i < sections.Length; i++)
                {
                    val += sections[i] + ":";
                }

                return Configuration[val.TrimEnd(':')];
            }
            catch (Exception)
            {
                return "";
            }
        }
    }

appsettings.json

"ServiceBus": {
    "PrimaryConnectionString": "Endpoint=sb://cnbateblogweb.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=X3O9dsC0c+mir8A7porSEn9S/LoQX9GB0TNCv0W6Ev0=",
    "QueueName": "CNBATEBLOGWEB_QUEUE"
  }

最重要的一步不要忘記了,回到Azure Portal 上,複製ServiceBus Queue 的 “Shared access policies”

完整程式碼請檢視文章底部 github 地址

3,測試-傳送Message

F5啟用除錯後,輸入 ”http://localhost:5000/ServiceBusQueue

Title 輸入:”First Message“

Content 輸入:“This is First Message-----Hello World”

點選 ”Send“ 傳送 Message

提示傳送 "Messgae Success"

回到 Azure Portal 進行驗證,點選 ”cnbateblogweb_queue“ 可以看到到“MESSAGE COUNTS=》Active部分中看到一條訊息

選擇 ”Settings=》Service Bus Explorer(preview)“,切換到 ”Peek“ 窺探資訊內容

OK,.NET CORE Web 應用程式傳送訊息到 ServiceBus Queue 演示完成!φ(゜▽゜*)♪

三,結尾

  OK,今天的分享到此結束,今天主要建立.NET Core Web 應用程式並且引用 ”Microsoft.Azure.ServiceBus“,通過 ”QueueClient“ 建立與Service Bus的連線傳送訊息到Azure ServiceBus Queue。本文所分享的內容也存在著很多我自己的一些理解,有理解不到位的,還包含,並且指出不足之處

參考資料:服務匯流排訊息傳遞https://docs.microsoft.com/zh-cn/azure/service-bus-messaging/

github:https://github.com/yunqian44/Azure.ServiceBus.git

作者:Allen 

版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。

相關文章