ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json

这篇具有很好参考价值的文章主要介绍了ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、前言

在大多数的应用程序中,一些参数需要写在配置文件里,以此增加系统的灵活性。在ASP.NET时代,配置参数一般会写在web.config文件中,其本质上是对XML文件的读取和写入。而在ASP.NET Core中,配置文件变成了appsettings.json文件。相较于XMLJSON文件更加轻量且灵活,下面就来介绍一下如何在ASP.NET Core中对其进行读写操作。

2、添加配置参数

打开appsettings.json文件,添加如下配置项。如果对JSON文件的格式不熟悉,建议先了解一下其格式规范,其代码如下所示:

{
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft": "Warning",
            "Microsoft.Hosting.Lifetime": "Information"
        }
    },
    "AllowedHosts": "*",
    "ConnectionStrings": {
        "ConnectionString": "Data Source=DSF-PC;Initial Catalog=Dao;User ID=sa;Password=123456"
    },
    "AppName": "ASP.NET Core API",   // 应用程序名称
    "Author": "HerryDong",           // 作者
    "AppSettings": {
        "DefaultLanguage": "zh-CN",  // 默认语言
        "MinLevel": 10,              // 地图最小层级
        "MaxLevel": 16,              // 地图最大层级
        "Center": {
            "Longitude": 120,        // 地图中心点经度
            "Latitude": 30           // 地图中心点维度
        }
    }
}

3、基于配置节点名称的读取

3.1、注入IConfiguration接口

ASP.NET Core中,如果希望通过配置项的名称获取配置参数,那就需要用到IConfiguration接口。该接口已经默认存在于IoC容器中,无需手动注册。创建一个新的控制器HomeController,在构造函数中注入IConfiguration接口,代码如下所示:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IConfiguration configuration;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="configuration"></param>
        public HomeController(IConfiguration configuration)
        {
            this.configuration = configuration;
        }
    }
}

3.2、读取配置参数

HomeController中添加一个Get方法,添加如下代码:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IConfiguration configuration;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="configuration"></param>
        public HomeController(IConfiguration configuration)
        {
            this.configuration = configuration;
        }

        /// <summary>
        /// 读取配置参数
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            string connectionString = configuration.GetConnectionString("ConnectionString");
            string appName = configuration["AppName"];
            string author = configuration["Author"];
            string defaultLanguage = configuration["AppSettings:DefaultLanguage"];
            string minLevel = configuration["AppSettings:MinLevel"];
            string maxLevel = configuration["AppSettings:MaxLevel"];
            string longitude = configuration["AppSettings:Center:Longitude"];
            string latitude = configuration["AppSettings:Center:Latitude"];
            return connectionString + "\n" + appName + "\n" + author + "\n" +
                   defaultLanguage + "\n" + minLevel + "\n" + maxLevel + "\n" +
                   longitude + "\n" + latitude;
        }
    }
}
3.2.1、数据库连接字符串

对于数据库连接字符串ConnectionString,可以直接通过IConfiguration接口的GetConnectionString方法进行获取:

string connectionString = configuration.GetConnectionString("ConnectionString");
3.2.2、一级子节点

由于AppNameAuthor位于一级节点,因此可通过如下方式进行获取:

string appName = configuration["AppName"];
string author = configuration["Author"];
3.2.3、二级子节点

二级节点DefaultLanguageMinLevelMaxLevel位于一级节点AppSettings下,因此需要通过添加一个冒号:的方式进行获取:

string defaultLanguage = configuration["AppSettings:DefaultLanguage"];
string minLevel = configuration["AppSettings:MinLevel"];
string maxLevel = configuration["AppSettings:MaxLevel"];
3.2.4、三级子节点

三级节点LongitudeLatitude位于二级节点Center下,因此需要通过添加两个冒号::的方式进行获取:

string longitude = configuration["AppSettings:Center:Longitude"];
string Latitude = configuration["AppSettings:Center:Latitude"];

通过配置节点名称获取配置参数的方法比较直观,在写法上只需要注意配置节点所在的层级即可,程序运行结果如下图所示:

ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json

4、基于配置文件实体类的读取

4.1、构建配置文件实体类

ASP.NET Core也允许通过配置文件实体类的方式读取配置文件。首先根据appsettings.json中各个节点的层级关系构建相应实体类ConfigModel,其代码如下所示:

namespace App
{
    public class ConfigModel
    {
        public ConnectionStrings ConnectionStrings { get; set; }
        public string AppName { get; set; }
        public string Author { get; set; }
        public AppSettings AppSettings { get; set; }
    }

    public class ConnectionStrings
    {
        public string ConnectionString { get; set; }
    }

    public class AppSettings
    {
        public string DefaultLanguage { get; set; }
        public int MinLevel { get; set; }
        public int MaxLevel { get; set; }
        public Center Center { get; set; }
    }

    public class Center
    {
        public double Longitude { get; set; }
        public double Latitude { get; set; }
    }
}

4.2、注册配置文件实体类

在构建完配置文件实体类后,我们需要在Startup.cs文件中对其进行注册,调用services.Configure方法即可,代码如下所示:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace App
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();

            // 注册配置文件实体类 
            services.Configure<ConfigModel>(Configuration);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

4.3、注入IOptions接口

这里需要注意,原先通过配置节点名称读取配置参数值的时候,我们注入的是IConfiguration接口,而这里则需要换成IOptions接口,最后通过IOptions.Value获取实体类。由于IOptions接口默认存在于IoC容器中,因此无需手动对其进行注册。其代码如下所示:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly ConfigModel model;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="options"></param>
        public HomeController(IOptions<ConfigModel> options)
        {
            this.model = options.Value;
        }
    }
}

4.4、读取配置参数

现在我们已经获取了配置文件实体类,接下来的工作很简单了,由于是强类型操作,Visual Studio 2019会帮助你自动感知配置项,其代码如下所示:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly ConfigModel model;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="options"></param>
        public HomeController(IOptions<ConfigModel> options)
        {
            this.model = options.Value;
        }

        /// <summary>
        /// 读取配置参数
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            string connectionString = model.ConnectionStrings.ConnectionString;
            string appName = model.AppName;
            string author = model.Author;
            string defaultLanguage = model.AppSettings.DefaultLanguage;
            int minLevel = model.AppSettings.MinLevel;
            int maxLevel = model.AppSettings.MaxLevel;
            double longitude = model.AppSettings.Center.Longitude;
            double latitude = model.AppSettings.Center.Latitude;
            return connectionString + "\n" + appName + "\n" + author + "\n" +
                   defaultLanguage + "\n" + minLevel + "\n" + maxLevel + "\n" +
                   longitude + "\n" + latitude;
        }
    }
}

IConfiguration接口读取配置参数的方法相比,IOptions接口的优势是可以利用实体类进行映射和读取,这也可以杜绝由于写错配置项名称而引起错误的弊端。程序运行结果如下图所示:

ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json

5、写入配置文件

5.1、获取appsettings.json的路径

其实在实际开发过程中,微软并不推荐开发者对appsettings.json文件进行动态修改,一些需要动态配置的参数最好写在其他文件中,但在某些特殊情况下我们还是得这么干。话说回来,既然涉及到文件修改,那我们肯定得先获取这个文件的路径,否则一切免谈。在ASP.NET Core中,如果要获取一个文件的路径,我们可以使用IWebHostEnvironment接口,在使用时只需要将其注入控制器的构造函数即可,由于它已经默认存在于IoC容器中,因此我们无需进行手动注册,代码如下所示:

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using System.IO;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IWebHostEnvironment webHostEnvironment;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="webHostEnvironment"></param>
        public HomeController(IWebHostEnvironment webHostEnvironment)
        {
            this.webHostEnvironment = webHostEnvironment;
        }

        /// <summary>
        /// 获取文件路径
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            string filePath = Path.Combine(webHostEnvironment.ContentRootPath, "appsettings.json");
            return filePath;
        }
    }
}

运行一下程序,发现可以正确获取appsettings.json文件的路径,如下图所示:

ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json

5.2、修改配置参数

我们可以借助Newtonsoft.Json来实现配置参数的修改,使用NuGet将其引入,如下图所示:

ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Linq;
using System.IO;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IWebHostEnvironment webHostEnvironment;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="webHostEnvironment"></param>
        public HomeController(IWebHostEnvironment webHostEnvironment)
        {
            this.webHostEnvironment = webHostEnvironment;
        }

        /// <summary>
        /// 修改配置参数
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            try
            {
                // 读取appsettings.json文本内容
                string filePath = Path.Combine(webHostEnvironment.ContentRootPath, "appsettings.json");
                string text = System.IO.File.ReadAllText(filePath);

                // 修改配置项
                JObject obj = JObject.Parse(text);
                obj["AppName"] = "API";
                obj["Author"] = "Herry";
                obj["AppSettings"]["DefaultLanguage"] = "en-US";
                obj["AppSettings"]["MinLevel"] = 15;
                obj["AppSettings"]["MaxLevel"] = 20;
                obj["AppSettings"]["Center"]["Longitude"] = 130;
                obj["AppSettings"]["Center"]["Latitude"] = 40;

                // 重新写入appsettings.json
                string result = obj.ToString();
                System.IO.File.WriteAllText(filePath, result);
                return "success";
            }
            catch
            {
                return "failed";
            }
        }
    }
}

运行程序,发现appsettings.json的配置项修改成功。但也可以发现一个问题:原先的注释都没了,因此最好不要对该文件进行动态修改。程序运行结果如下图所示:
ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json

5.3、注入IOptionsSnapshot接口

现在我们已经实现了appsettings.json文件的修改,但如果仍旧使用IOptions接口读取配置参数会怎么样呢?看下面一段代码:

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Linq;
using System.IO;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IWebHostEnvironment webHostEnvironment;
        private readonly ConfigModel model;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="webHostEnvironment"></param>
        /// <param name="options"></param>
        public HomeController(IWebHostEnvironment webHostEnvironment,
                              IOptions<ConfigModel> options)
        {
            this.webHostEnvironment = webHostEnvironment;
            this.model = options.Value;
        }

        /// <summary>
        /// 修改配置参数
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            try
            {
                // 读取appsettings.json文本内容
                string filePath = Path.Combine(webHostEnvironment.ContentRootPath, "appsettings.json");
                string text = System.IO.File.ReadAllText(filePath);

                // 修改
                JObject obj = JObject.Parse(text);
                obj["AppName"] = "API";
                obj["Author"] = "Herry";
                obj["AppSettings"]["DefaultLanguage"] = "en-US";
                obj["AppSettings"]["MinLevel"] = 15;
                obj["AppSettings"]["MaxLevel"] = 20;
                obj["AppSettings"]["Center"]["Longitude"] = 130;
                obj["AppSettings"]["Center"]["Latitude"] = 40;

                // 重新写入appsettings.json
                string result = obj.ToString();
                System.IO.File.WriteAllText(filePath, result);
                return "success";
            }
            catch
            {
                return "failed";
            }
        }

        /// <summary>
        /// 读取配置参数
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get_2()
        {
            string connectionString = model.ConnectionStrings.ConnectionString;
            string appName = model.AppName;
            string author = model.Author;
            string defaultLanguage = model.AppSettings.DefaultLanguage;
            int minLevel = model.AppSettings.MinLevel;
            int maxLevel = model.AppSettings.MaxLevel;
            double longitude = model.AppSettings.Center.Longitude;
            double latitude = model.AppSettings.Center.Latitude;
            return connectionString + "\n" + appName + "\n" + author + "\n" +
                   defaultLanguage + "\n" + minLevel + "\n" + maxLevel + "\n" +
                   longitude + "\n" + latitude;
        }
    }
}

在执行完Get方法后,我们再执行Get_2方法,发现好像不太对,怎么读出来的还是修改前的配置参数?

ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json
其实,如果对appsettings.json文件做了修改,那么就不能使用IOptions接口去读取配置参数了,因为该接口实例被注册为全局单例生命周期,因此无法读到最新的配置参数。在这种情况下,我们需要使用另一个接口来实现配置参数的读取,那就是IOptionsSnapshot接口,由于该接口被注册为域生命周期,因此每次http访问都能读取到最新配置,其代码如下所示:

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Newtonsoft.Json.Linq;
using System.IO;

namespace App.Controllers
{
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        private readonly IWebHostEnvironment webHostEnvironment;
        private readonly ConfigModel model;

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="webHostEnvironment"></param>
        /// <param name="options"></param>
        public HomeController(IWebHostEnvironment webHostEnvironment,
                              IOptionsSnapshot<ConfigModel> options)
        {
            this.webHostEnvironment = webHostEnvironment;
            this.model = options.Value;
        }

        /// <summary>
        /// 修改配置参数
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get()
        {
            try
            {
                // 读取appsettings.json文本内容
                string filePath = Path.Combine(webHostEnvironment.ContentRootPath, "appsettings.json");
                string text = System.IO.File.ReadAllText(filePath);

                // 修改
                JObject obj = JObject.Parse(text);
                obj["AppName"] = "API";
                obj["Author"] = "Herry";
                obj["AppSettings"]["DefaultLanguage"] = "en-US";
                obj["AppSettings"]["MinLevel"] = 15;
                obj["AppSettings"]["MaxLevel"] = 20;
                obj["AppSettings"]["Center"]["Longitude"] = 130;
                obj["AppSettings"]["Center"]["Latitude"] = 40;

                // 重新写入appsettings.json
                string result = obj.ToString();
                System.IO.File.WriteAllText(filePath, result);
                return "success";
            }
            catch
            {
                return "failed";
            }
        }

        /// <summary>
        /// 读取配置参数
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public string Get_2()
        {
            string connectionString = model.ConnectionStrings.ConnectionString;
            string appName = model.AppName;
            string author = model.Author;
            string defaultLanguage = model.AppSettings.DefaultLanguage;
            int minLevel = model.AppSettings.MinLevel;
            int maxLevel = model.AppSettings.MaxLevel;
            double longitude = model.AppSettings.Center.Longitude;
            double latitude = model.AppSettings.Center.Latitude;
            return connectionString + "\n" + appName + "\n" + author + "\n" +
                   defaultLanguage + "\n" + minLevel + "\n" + maxLevel + "\n" +
                   longitude + "\n" + latitude;
        }
    }
}

运行程序,发现可以读取到最新的配置参数,结果如下图所示:

ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json

6、结语

本文主要介绍了ASP.NET Core中配置文件的读写方法。在实际开发过程中,如果涉及到项目迁移,即:之前已经存在很多配置参数,我们可以使用IConfiguration接口读取配置参数,如果是新的项目,则可以考虑使用IOptions接口读取,因为强类型的读取方法可以避免因配置项名称写错而引发的一系列问题。文章来源地址https://www.toymoban.com/news/detail-458088.html

到了这里,关于ASP.NET Core 3.1系列(4)——读写配置文件appsettings.json的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Asp .Net Core 系列: 集成 CORS跨域配置

    CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。 在Web应用程序中,CORS定义了一种机制,通过该机制,浏览器能够限制哪些外部网页可以访问来自不同源的资源。源由协议、域名和端口组成。当一

    2024年01月24日
    浏览(88)
  • asp.net core在发布时排除配置文件

    使用命令发布 dotnet restore dotnet publish -c Release -r win-x64 -o \\\"D:services\\\"  这样发布总是是将配置文件覆盖  这时候打开项目.csproj新增配置文件

    2024年04月24日
    浏览(37)
  • Asp.net Core系列学习(1)

    ASP.NET Core 是一个跨平台的高性能开源 框架 ,用于生成启用云且连接 Internet 的新式应用。 使用 ASP.NET Core,可以: 生成 Web 应用和服务、物联网 (IoT) 应用和移动后端。 在 Windows、macOS 和 Linux 上使用喜爱的开发工具。 部署到云或本地。 在 .NET Core 上运行。 ASP.NET Core 是对 ASP

    2024年02月06日
    浏览(66)
  • ASP.NET Core 依赖注入系列一

    什么是ASP.NET Core 依赖注入? 依赖注入也称DI是一项技术用来实现对象松耦合以至于应用程序更容易维护,ASP.NET Core通过控制器的构造函数自动注入依赖的对象,我们创建ASP.NET Core MVC应用程序演示依赖注入特性是如何工作, 在这节中我们讲解该特性 1 例子 我们创建一个ASP.NET C

    2024年02月11日
    浏览(53)
  • ASP.NET Core SignalR 系列(二)- 中心(服务端)

    本章将和大家分享 ASP.NET Core SignalR 中的中心(服务端)。 本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hubs?view=aspnetcore-7.0 废话不多说,我们直接来看一个Demo,Demo的目录结构如下所示: 本Demo的Web项目为ASP.NET Core Web 应用程序( 目标框架为.NET 7.0

    2024年02月13日
    浏览(53)
  • ASP.NET Core SignalR 系列(四)- 中心筛选器

    本章将和大家分享 ASP.NET Core SignalR 中的中心筛选器。 本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/hub-filters?view=aspnetcore-7.0 废话不多说,下面我们直接进入本章主题。 中心筛选器: 在 ASP.NET Core 5.0 或更高版本中可用。 允许在客户端调用中心方法之

    2024年02月16日
    浏览(46)
  • 你所不知道的ASP.NET Core进阶系列(三)

    一年多没更新博客,上一次写此系列还是四年前,虽迟但到,没有承诺,主打随性,所以不存在断更,催更,哈哈,上一篇我们细究从请求到绑定详细原理,本篇则是探讨模型绑定细节,当一个问题产生到最终解决时,回过头我们整体分析其产生背景以及设计思路才能有所获

    2024年02月05日
    浏览(93)
  • ASP.NET Core —配置系统

    一个应用要运行起来,往往需要读取很多的预设好的配置信息,根据约定好的信息或方式执行一定的行为。 配置的本质就是软件运行的参数,在一个软件实现中需要的参数非常多,如果我们以 Hard Code (硬编码)的方式写在应用代码中,这样配置就会很乱,而且后续也不容易修

    2024年02月08日
    浏览(53)
  • ASP.NET Core SignalR 系列(三)- JavaScript 客户端

    本章将和大家分享 ASP.NET Core SignalR 中的 JavaScript 客户端。ASP.NET Core SignalR JavaScript 客户端库使开发人员能够调用服务器端SignalR中心代码。 本文大部分内容摘自微软官网:https://learn.microsoft.com/zh-cn/aspnet/core/signalr/javascript-client?view=aspnetcore-7.0tabs=visual-studio 废话不多说,下面我们

    2024年02月15日
    浏览(52)
  • Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查

    官网:https://www.consul.io/ Consul 是一款开源的服务发现和配置管理工具,它能够监控应用程序和服务之间的通信,并提供了一组 API 和 Web UI,用于管理服务和配置。 Consul 是分布式的、高可用的、可横向扩展的,具备以下特性: 服务发现:Consul 通过 DNS 或者 HTTP 接口使服务注册

    2024年01月21日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包