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 

版权:转载请在文章明显位置注明做者及出处。如发现错误,欢迎批评指正。

相关文章
相关标签/搜索