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

一,引言

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

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

Azure ServiceBus 系列:github

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」 搜索,而且進行建立。web

Resource group 選擇:「Web_Test_SB_RG」json

Namespace name:「cnbateblogweb」windows

Loaction:「East Asia」bash

Pricing tier:「Basic」app

點擊 「Review + create」 進行建立預校驗。框架

校驗完成後,點擊 「Create」 進行建立async

建立完成後,點擊 「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 

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

相關文章
相關標籤/搜索