当前位置: 首页 > news >正文

C# WebApi 接口测试工具:WebApiTestClient应用技术详解

目录

一、引言      

二、WebApiTestClient介绍

1、特性

2、应用场景

三、WebApiTestClient具体使用

1、WebApi项目引入组件

2、如何使用组件

 1、修改Api.cshtml文件

2、配置读取注释的xml路径

3、测试接口

四、总结


一、引言      

         由于最近项目需要开发WebApi接口,接口开发完了需要自测或提供给第三方进行调试,看了网上的方法,大多都是使用第三方测试工具,如Postman、Fiddler等,但这些虽然功能强大,但使用起来较为繁琐,如Postman还需要注册、下载及安装等,因此就搜索其他的调试方法,如WebApiTestClient和swagger,这些都是轻量级的,可直接集成在项目中使用,很方便,本文主要介绍在WebApi中使用WebApiTestClien接口测试工具的应用。

二、WebApiTestClient介绍

        WebApiTestClient是一款专门为调试和测试ASP.NET WebApi设计的工具,可以通过简洁的Web界面发送请求并查看响应。在API开发过程中,它可以帮助开发者更高效地进行调试和验证。

1、特性

  1. 简洁的Web界面:无需额外安装复杂的工具,通过Web浏览器即可访问和使用。
  2. 易于集成:作为NuGet包,可以方便地集成到现有的ASP.NET WebApi项目中。
  3. 灵活的请求配置:可以自定义HTTP方法、请求头、请求体等,便于模拟各种请求场景。
  4. 实时查看响应:即时查看API的响应,包括状态码、响应头和响应体,便于调试。

2、应用场景

1)开发阶段的调试

在开发阶段,WebApiTestClient可以用于快速验证API是否按预期工作。通过其简洁的界面,可以轻松构造各种HTTP请求并查看响应,便于发现和修复问题。

2)测试API端点

在测试阶段,QA工程师可以使用WebApiTestClient模拟各种请求,验证API的稳定性和正确性。能够自定义请求参数和请求体,也有助于进行边界测试和异常处理测试。

3)与前端开发的协同

前后端分离的开发模式下,前端开发人员可以使用WebApiTestClient测试后端API的接口,确保数据交互的正确性,减少前后端联调的时间和成本。

4)快速验证和演示

在需求评审或技术交流过程中,开发者可以使用WebApiTestClient进行快速验证和演示,展示API的功能和数据交互过程,提高沟通效率。

 

三、WebApiTestClient具体使用

1、WebApi项目引入组件

首先,我们需要定义一个API项目

然后通过Nuget引入组件,如下图。记住选下图中的第一个WebApiTestClient进行安装。

引入成功后,将向项目里面添加一些主要文件:

  • Scripts\WebApiTestClient.js
  • Areas\HelpPage\TestClient.css
  • Areas\HelpPage\Views\Help\DisplayTemplates\TestClientDialogs.cshtml
  • Areas\HelpPage\Views\Help\DisplayTemplates\TestClientReferences.cshtml

2、如何使用组件

 1、修改Api.cshtml文件

通过上述步骤,就能将组件WebAPITestClient引入进来。下面我们只需要做一件事:打开文件 (根据 Areas\HelpPage\Views\Help) Api.cshtml 并添加以下内容:

  • @Html.DisplayForModel("TestClientDialogs")
  • @Html.DisplayForModel("TestClientReferences")

添加后Api.cshtml文件的代码如下

@using System.Web.Http
@using WebApiDemo.Areas.HelpPage.Models
@model HelpPageApiModel@{var description = Model.ApiDescription;ViewBag.Title = description.HttpMethod.Method + " " + description.RelativePath;
}<link type="text/css" href="~/Areas/HelpPage/HelpPage.css" rel="stylesheet" />
<div id="body" class="help-page"><section class="featured"><div class="content-wrapper"><p>@Html.ActionLink("Help Page Home", "Index")</p></div></section><section class="content-wrapper main-content clear-fix">@Html.DisplayForModel()</section>
</div>
@Html.DisplayForModel("TestClientDialogs")
@section Scripts{<link href="~/Areas/HelpPage/HelpPage.css" rel="stylesheet" />@Html.DisplayForModel("TestClientReferences")
}

 

2、配置读取注释的xml路径

其实,通过上面的步骤,我们的项目已经可以跑起来了,也可以调用接口测试。但是,还不能读取 /// <summary> 注释里面的东西。需要做如下配置才行。

(1)配置生成xml的路径。我们在项目上面点右键→属性→生成标签页配置xml的路径

(2)在xml的读取路径:在下图的HelpPageConfig.cs里面配置一句话,指定xml的读取路径。

这句代码如下:

config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/WebApiDemo.xml")));

 HelpPageConfig.cs完整文件入下:

// Uncomment the following to provide samples for PageResult<T>. Must also add the Microsoft.AspNet.WebApi.OData
// package to your project.
#define Handle_PageResultOfTusing System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net.Http.Headers;
using System.Reflection;
using System.Web;
using System.Web.Http;
#if Handle_PageResultOfT
using System.Web.Http.OData;
#endifnamespace WebApiDemo.Areas.HelpPage
{/// <summary>/// Use this class to customize the Help Page./// For example you can set a custom <see cref="System.Web.Http.Description.IDocumentationProvider"/> to supply the documentation/// or you can provide the samples for the requests/responses./// </summary>public static class HelpPageConfig{[SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters",MessageId = "WebApiDemo.Areas.HelpPage.TextSample.#ctor(System.String)",Justification = "End users may choose to merge this string with existing localized resources.")][SuppressMessage("Microsoft.Naming", "CA2204:Literals should be spelled correctly",MessageId = "bsonspec",Justification = "Part of a URI.")]public static void Register(HttpConfiguration config){Uncomment the following to use the documentation from XML documentation file.//config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));Uncomment the following to use "sample string" as the sample for all actions that have string as the body parameter or return type.Also, the string arrays will be used for IEnumerable<string>. The sample objects will be serialized into different media type formats by the available formatters.//config.SetSampleObjects(new Dictionary<Type, object>//{//    {typeof(string), "sample string"},//    {typeof(IEnumerable<string>), new string[]{"sample 1", "sample 2"}}//});// Extend the following to provide factories for types not handled automatically (those lacking parameterless// constructors) or for which you prefer to use non-default property values. Line below provides a fallback// since automatic handling will fail and GeneratePageResult handles only a single type.
#if Handle_PageResultOfTconfig.GetHelpPageSampleGenerator().SampleObjectFactories.Add(GeneratePageResult);
#endif// Extend the following to use a preset object directly as the sample for all actions that support a media// type, regardless of the body parameter or return type. The lines below avoid display of binary content.// The BsonMediaTypeFormatter (if available) is not used to serialize the TextSample object.config.SetSampleForMediaType(new TextSample("Binary JSON content. See http://bsonspec.org for details."),new MediaTypeHeaderValue("application/bson"));Uncomment the following to use "[0]=foo&[1]=bar" directly as the sample for all actions that support form URL encoded formatand have IEnumerable<string> as the body parameter or return type.//config.SetSampleForType("[0]=foo&[1]=bar", new MediaTypeHeaderValue("application/x-www-form-urlencoded"), typeof(IEnumerable<string>));Uncomment the following to use "1234" directly as the request sample for media type "text/plain" on the controller named "Values"and action named "Put".//config.SetSampleRequest("1234", new MediaTypeHeaderValue("text/plain"), "Values", "Put");Uncomment the following to use the image on "../images/aspNetHome.png" directly as the response sample for media type "image/png"on the controller named "Values" and action named "Get" with parameter "id".//config.SetSampleResponse(new ImageSample("../images/aspNetHome.png"), new MediaTypeHeaderValue("image/png"), "Values", "Get", "id");Uncomment the following to correct the sample request when the action expects an HttpRequestMessage with ObjectContent<string>.The sample will be generated as if the controller named "Values" and action named "Get" were having string as the body parameter.//config.SetActualRequestType(typeof(string), "Values", "Get");Uncomment the following to correct the sample response when the action returns an HttpResponseMessage with ObjectContent<string>.The sample will be generated as if the controller named "Values" and action named "Post" were returning a string.//config.SetActualResponseType(typeof(string), "Values", "Post");config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/WebApiDemo.xml")));}#if Handle_PageResultOfTprivate static object GeneratePageResult(HelpPageSampleGenerator sampleGenerator, Type type){if (type.IsGenericType){Type openGenericType = type.GetGenericTypeDefinition();if (openGenericType == typeof(PageResult<>)){// Get the T in PageResult<T>Type[] typeParameters = type.GetGenericArguments();Debug.Assert(typeParameters.Length == 1);// Create an enumeration to pass as the first parameter to the PageResult<T> constuctorType itemsType = typeof(List<>).MakeGenericType(typeParameters);object items = sampleGenerator.GetSampleObject(itemsType);// Fill in the other information needed to invoke the PageResult<T> constuctorType[] parameterTypes = new Type[] { itemsType, typeof(Uri), typeof(long?), };object[] parameters = new object[] { items, null, (long)ObjectGenerator.DefaultCollectionSize, };// Call PageResult(IEnumerable<T> items, Uri nextPageLink, long? count) constructorConstructorInfo constructor = type.GetConstructor(parameterTypes);return constructor.Invoke(parameters);}}return null;}
#endif}
}

3、测试接口

下面仅为简单接口,仅为项目说明使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;namespace WebApiDemo.Controllers
{public class ValuesController : ApiController{// GET api/valuespublic IEnumerable<string> Get(){return new string[] { "value1", "value2" };}// GET api/values/5public string Get(int id){return "value";}// POST api/valuespublic void Post([FromBody]string value){}// PUT api/values/5public void Put(int id, [FromBody]string value){}// DELETE api/values/5public void Delete(int id){}}
}

         到这里组件就搭完了,剩下的就是运行了。如果过我们是是把webAPI部署在IIS或其他服务器上,在浏览器url里面敲地址http://IP地址:端口/Help即可显示WebApiTestClient调试页面;这里我是直接通过Visual Studio 2017调试弹出WebApiTestClient调试页面,如下:

WebApiTestClient调试页面展示:

接口调试:

点击某一个接口查看接口详细。例如本文查看Get请求的无参方法,右下角有按钮可以测试接口。 

点击“Test API”按钮

点击Send发送请求

 

第二个有参数的接口

手动输入参数

 点“Send”得到返回结果

 

四、总结

        WebApiTestClient 是一种专门用于调试和测试 ASP.NET WebApi 的工具,其设计简洁、功能强大,具有以下几大优点:

1. 简洁易用

  • Web界面:无需安装繁琐的外部工具,通过浏览器即可访问和使用,界面友好,操作简单。
  • 易于集成:作为 NuGet 包,可以方便地集成到现有的 ASP.NET WebApi 项目中,配置简单,不需要额外的复杂步骤。

2. 灵活的请求配置

  • 多种HTTP方法:支持 GET、POST、PUT、DELETE 等常见的 HTTP 请求方法,能够模拟各种请求场景。
  • 自定义请求参数:允许用户自定义请求头、请求体和查询参数,灵活性高,便于模拟实际应用中的复杂请求。

3. 实时查看响应

  • 即时反馈:可以即时查看 API 的响应结果,包括状态码、响应头和响应体,帮助开发者快速发现和定位问题。
  • 详细信息:能够详细显示请求和响应的所有细节,便于调试和分析。

4. 提高开发效率

  • 快速验证:在开发过程中,可以快速验证 API 的功能是否正确,无需切换到其他工具,大大提高开发效率。
  • 减少联调时间:前后端分离的开发模式下,前端开发人员可以快速验证后端 API 的接口,减少前后端联调的时间和成本。

5. 便于展示和沟通

  • 演示友好:在需求评审或技术交流过程中,可以使用 WebApiTestClient 进行实时演示,展示 API 的功能和数据交互过程,提高沟通效率。
  • 文档生成:部分集成了API文档生成功能,便于开发者和测试人员查看和使用。

6. 配置灵活

  • 路由配置:可以灵活配置路由,适应不同项目的需求。
  • 环境适应:适用于开发、测试环境,便于不同阶段的调试和测试工作。

7. 无需依赖外部工具

  • 内置解决方案:作为 ASP.NET WebApi 的内置调试解决方案,不需要依赖外部工具,减少了环境配置和维护的复杂度。

          WebApiTestClient 以其简洁易用、灵活配置、即时反馈等优点,成为了调试和测试 ASP.NET WebApi 的理想工具。它不仅提高了开发和测试效率,而且在前后端联调、需求评审等场景中也发挥了重要作用,为开发者提供了极大的便利。

相关文章:

C# WebApi 接口测试工具:WebApiTestClient应用技术详解

目录 一、引言 二、WebApiTestClient介绍 1、特性 2、应用场景 三、WebApiTestClient具体使用 1、WebApi项目引入组件 2、如何使用组件 1、修改Api.cshtml文件 2、配置读取注释的xml路径 3、测试接口 四、总结 一、引言 由于最近项目需要开发WebApi接口&…...

Qt_ymode自己实现

文章内容: 通过Qt实现Ymode协议的封装。通过传入的数据从里面一包一包拿数据。可以用作平时串口和网口的通信。也可以用来程序升级。 #include "ymodem.h"Ymodem::Ymodem() {m_data = nullptr; }Ymodem...

5.3章节python中字典:字典创建、元素访问、相关操作

1.字典的创建和删除 2.字典的访问和遍历 3.字典的相关操作 4.字典的生成式 一、字典的创建和删除 字典&#xff08;dictionary&#xff09;是一种用于存储键值对&#xff08;key-value pairs&#xff09;的数据结构。每个键&#xff08;key&#xff09;都映射到一个值&#xf…...

ECCV2024 Tracking 汇总

一、OneTrack: Demystifying the Conflict Between Detection and Tracking in End-to-End 3D Trackers paper&#xff1a; https://www.ecva.net/papers/eccv_2024/papers_ECCV/papers/01174.pdf 二、VETRA: A Dataset for Vehicle Tracking in Aerial Imagery paper&#…...

C语言知识点

命名规则&#xff1a; 字符组成&#xff1a;标识符只能由字母&#xff08;A~Z&#xff0c;a~z&#xff09;、数字&#xff08;0~9&#xff09;和下划线&#xff08;_&#xff09;组成。首字符要求&#xff1a;标识符的第一个字符必须是字母或下划线&#xff0c;不能是数字。长…...

ICMP协议以及ARP欺骗攻击

ping 命令使用的是 ICMP&#xff08;Internet Control Message Protocol&#xff09;协议&#xff0c;而不是 TCP 或 UDP 协议。因此&#xff0c;ping 命令并不使用特定的端口号。 ICMP 协议 ICMP 是一种网络层协议&#xff0c;主要用于在 IP 网络中传递控制消息。ping 命令利…...

qt5.12.12插件机制无法加载插件问题

环境&#xff1a;win11 vs2015 qt5.12.12 问题描述&#xff1a;确保插件代码正确的情况下&#xff0c;无法解析插件接口&#xff08;即QPluginLoader类的instance(); 返回为空&#xff09;。 问题现象&#xff1a;1、qt5.12.12的debug下无法解析&#xff1b;2、release下禁…...

机器学习面试笔试知识点-线性回归、逻辑回归(Logistics Regression)和支持向量机(SVM)

机器学习面试笔试知识点-线性回归、逻辑回归Logistics Regression和支持向量机SVM 一、线性回归1.线性回归的假设函数2.线性回归的损失函数(Loss Function)两者区别3.简述岭回归与Lasso回归以及使用场景4.什么场景下用L1、L2正则化5.什么是ElasticNet回归6.ElasticNet回归的使…...

SpringBoot民宿预订系统设计与实现

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…...

linux环境下C程序的编译过程以及makefile的简单使用

在windows下&#xff0c;很多用来进行编程软件对于写好的文件&#xff0c;点击编译即可生成想要文件。如.exe可执行文件&#xff0c;.hex文件或者.bin文件等等。软件为我们省略了很多事。但是对于linux初学者来说&#xff0c;初次接触linux系统&#xff0c;面对命令行黑框框有点…...

【从零开始的LeetCode-算法】945. 使数组唯一的最小增量

给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 < i < nums.length 的下标 i&#xff0c;并将 nums[i] 递增 1。 返回使 nums 中的每个值都变成唯一的所需要的最少操作次数。 生成的测试用例保证答案在 32 位整数范围内。 示例 1&#xff1a; 输入&am…...

Java程序设计:spring boot(2)

目录 1 Spring MVC 零配置创建与部署 1.1 创建Spring MVC Web⼯程 1.2 pom.xml 添加坐标相关配置 1.3 添加源代码 1.4 添加视图 1.5 SpringMVC 配置类添加 1.6 入口文件代码添加 1.7 部署与测试 2 Spring Boot 概念&特点 2.1 框架概念 2.2 框架特点 2.3 Spring…...

服务器运维监控平台

云监控平台-简介 一&#xff1a;简介 “phoenix” 是一个灵活可配置的开源监控平台&#xff0c;主要用于监控应用程序、服务器、docker、数据库、网络、tcp 端口和 http 接口&#xff0c;通过实时收集、汇聚和分析监控信息&#xff0c;实现在发现异常时立刻推送告警信息&…...

css中 global 和 deep(两个样式穿透) 区别

1.:global(selector)&#xff1a;这个伪类选择器会选择所有全局的、未被其他样式表覆盖的元素。换句话说&#xff0c;它会匹配所有没有被其他样式表&#xff08;例如内联样式或外部样式表&#xff09;所影响的元素。 :global(p) {color: red; }这段代码会将所有 <p> 元素…...

【星闪技术】WS63E模块的WiFi客户端测试

引言 我所计划的WS63E测试要实现MQTT联网&#xff0c;所以首先需要确保开发板连接WiFi。今天来测试一下WiFi功能。 程序分析 WiFi客户端的例子在src/application/samples/wifi/sta_sample目录下。这个例子看上去和hi3861的例子差不多。 这段程序是一个用于嵌入式设备的Wi-F…...

Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 面试题目1&#xff1a;Kotlin中的协程与线程的区别是什么&#xff1f;如何在Android中使用协程进行异步编程&#xff1f; 解答&#xff1a; 协…...

操作系统 和 初识进程

目录 操作系统&#xff08;OS&#xff09; 进程 操作系统&#xff08;OS&#xff09; 概念 操作系统即os&#xff0c;是一款软件。 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。 操作系统的本质是一种进行软硬件管理的软件 笼统的理解&#xf…...

QT--Qlabel学习、获取文本和设置文本、文本对齐方式、文本换行、显示图片

QLabel 是 Qt 中的标签类&#xff0c;通常用于显示提示性的文本&#xff0c;也可以显示图像 对齐方式 用于设置标签中的内容在水平和垂直两个方向上的对齐方式&#xff0c;比如左对齐、右对齐、上对齐、下对齐、水平居中、垂直居中等。 // 获取和设置文本的对齐方式 Qt::Ali…...

深度学习:终身学习(Life-Long Learning)详解

终身学习&#xff08;Life-Long Learning&#xff09;详解 终身学习&#xff08;也称为持续学习或增量学习&#xff09;是机器学习中的一个重要研究领域&#xff0c;它关注如何使机器学习模型在完成一系列任务后&#xff0c;能够持续学习新任务&#xff0c;而不会忘记之前学到…...

前端UI框架

组件UI类 1.Element-Plus 2.uView 3.Vant 4.TDesign 5.uni-app 6.Tuniao-vue3 7. 可视化图标类 1.可视化图标VUE Data UI 2.Echart 图标库ICON 1.yesicon 2.Flaticon 3.Google Fonts 4.fontawesome 5.阿里巴巴 其他 1.CSS布局 2.web前端样式布局 3.中国色-颜色合集 托管…...

最佳副屏串流解决方案:如何低成本打造电脑拓展副屏?

如何低成本打造电脑拓展副屏&#xff1f;如果你有一台平板和一台电脑&#xff0c;想要提高打游戏、办公或是学习的效率。那么&#xff0c;使用网易GameViewer远程&#xff0c;就能帮你低成本打造电脑拓展副屏。 简单来说&#xff0c;副屏串流就是能让你多出一块显示屏。在打游戏…...

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是可控的&#xff0c;并且参数会带入到数据库中执行&#xff0c;导致…...

【Linux 从基础到进阶】磁盘I/O性能调优

磁盘I/O性能调优 1. 引言 磁盘I/O性能是决定服务器整体性能的关键因素之一。磁盘I/O性能的瓶颈常常会影响数据库、文件系统以及虚拟化平台等关键应用的响应时间。因此&#xff0c;磁盘I/O调优是系统管理员不可忽视的任务。 本文将介绍影响磁盘I/O性能的主要因素&#xff0c;…...

浅谈AGI时代的“数据枢纽”——向量数据库

一、前言 人工智能的关键&#xff0c;不只是构建好算力、算法、模型&#xff0c;更重要的是做好数据的清洗、处理、挖掘等问题。一定程度上&#xff0c;智能时代&#xff0c;企业数据处理能力有多强&#xff0c;决定了业务发展的天花板有多高。 在企业数智化转型过程中&#x…...

生成 Excel 表列名称

Excel 大家都用过&#xff0c;它的列名是用字母编号的&#xff0c;A 表示第一列&#xff0c;B 表示第二列&#xff0c;AA 表示第27列&#xff0c;AB 表示第28列等等。 现给定一个数字&#xff0c;如何得到列名称呢。比如输入28&#xff0c;输出 AB。 一开始以为就是一个简单的…...

基于yolov10的烟雾明火检测森林火灾系统python源码+pytorch模型+评估指标曲线+精美GUI界面+数据集

【算法介绍】 基于YOLOv10的烟雾明火检测森林火灾系统是一种先进的火灾预警系统&#xff0c;它结合了深度学习和计算机视觉技术&#xff0c;能够实时检测和分析森林中的烟雾和明火&#xff0c;从而有效预防和控制森林火灾的发生。 该系统主要基于YOLOv10模型进行构建&#xf…...

UltraISO(软碟通)制作U盘制作Ubuntu20.04启动盘

目录 一、启动盘制作 1、工具准备 2、打开UltraISO后&#xff0c;点击左上角的文件&#xff0c;在打开的下拉项中&#xff0c;选择打开准备好的Ubuntu系统20.04 LTS镜像文件(ubuntu-20.04-desktop-amd64.iso)&#xff1b; 3、然后点击启动->写入硬盘映像 4、在弹出的窗…...

【EtherCAT实践篇一】TwinCAT 3安装、使用

TwinCAT 基于 PC 的开放式控制技术 倍福推出的基于 PC 的控制技术定义了自动化领域的全球标准。在软件方面&#xff0c;1996 年推出的 TwinCAT&#xff08;The Windows Control and Automation Technology&#xff0c;基于 Windows 的控制和自动化技术&#xff09;自动化套件是…...

4、CSS3笔记

文章目录 四、CSS3CSS3简介css3概述CSS3私有前缀什么是私有前缀为什么要有私有前缀常见浏览器私有前缀 CSS3基本语法CSS3新增长度单位CSS3新增颜色设置方式CSS3新增选择器CSS3新增盒模型相关属性box-sizing 怪异盒模型resize 调整盒子大小box-shadow 盒子阴影opacity 不透明度 …...

Docker无法拉取镜像解决办法

Docker 无法拉取镜像解决办法 一.现象描述 在docker拉取镜像的时候重复拉取镜像然后超时。 二.解决办法 1.配置国内镜像源地址加速 vi /etc/docker/daemon.json在文件中增加如下内容 { "registry-mirrors": ["https://docker.m.daocloud.io","h…...