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

C#使用MVC框架创建WebApi服务接口

第一步,使用VS2019新建MVC-Web API应用程序

创建BridgeApi

第二步,运行将生成默认的示例网页,网页Url为

https://localhost:44361/home/index

右键 项目 添加 WebAPI控制器类

 添加 

我们可以看到App_Start目录下 有三个文件:

BundleConfig.cs代表 捆绑文件的引用 

有脚本文件ScriptBundle的引用(javascript文件,后缀名.js)

和层叠样式表文件StyleBundle(即css网页排版文件,后缀名.css)

FilterConfig.cs代表全局筛选器

RouteConfig.cs代表url路由模式和action信息

右键,项目,将类库项目更新为控制台应用程序,并添加类Program

添加开源框架Topshelf的引用,添加Owin框架的引用

Topshelf 框架

Topshelf 是一个开源的跨平台的宿主服务框架,支持 Windows 和 Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。

使用 Topshelf 可以非常方便的将一个 C# 控制台程序部署成为一个 Windows Service, 使用它可以很方便的构建跨平台服务寄主,而在调试时直接以控制台的形式运行即可,非常方便。

Owin框架

OWIN 允许 Web 应用从 Web 服务器分离。 它定义了在管道中使用中间件来处理请求和相关响应的标准方法。 WebAPI应用程序和中间件可以与基于 OWIN 的应用程序、服务器和中间件进行互操作。

我们在web.config(有些是app.config)增加webAPI地址和端口

ApiAddress和ApiPort

<?xml version="1.0" encoding="utf-8"?>
<!--有关如何配置 ASP.NET 应用程序的详细信息,请访问https://go.microsoft.com/fwlink/?LinkId=301880-->
<configuration><appSettings><add key="webpages:Version" value="3.0.0.0" /><add key="webpages:Enabled" value="false" /><add key="ClientValidationEnabled" value="true" /><add key="UnobtrusiveJavaScriptEnabled" value="true" /><add key="ApiAddress" value="" /><add key="ApiPort" value="45678" /></appSettings>
</configuration>

Program.cs如下:

using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Topshelf;
using Topshelf.HostConfigurators;
/*
* Topshelf 是一个开源的跨平台的宿主服务框架,支持 Windows 和 Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。
* 使用 Topshelf 可以非常方便的将一个 C# 控制台程序部署成为一个 Windows Service, 使用它可以很方便的构建跨平台服务寄主,
* 而在调试时直接以控制台的形式运行即可,非常方便。
* Owin框架
* OWIN 允许 Web 应用从 Web 服务器分离。 它定义了在管道中使用中间件来处理请求和相关响应的标准方法。 
* WebAPI应用程序和中间件可以与基于 OWIN 的应用程序、服务器和中间件进行互操作。
*/namespace BridgeApi
{public class Program{static void Main(string[] args){Console.WriteLine("WebAPI程序启动开始...");HostFactory.Run(new Action<HostConfigurator>(HostConf));Console.ReadLine();}public static void HostConf(HostConfigurator hostConfigurator){// 服务使用NETWORK_SERVICE内置帐户运行。身份标识,有好几种方式,如:x.RunAs("username", "password");  x.RunAsPrompt(); x.RunAsNetworkService(); 等hostConfigurator.RunAsLocalService();//以服务//x.StartAutomatically();//StartModeExtensions//x.StartManually();//手动模式hostConfigurator.SetDescription("WebAPIServer 斯内科 Topshelf Host服务的描述"); //安装服务后,服务的描述hostConfigurator.SetDisplayName("WebAPIServerSnake"); //显示名称hostConfigurator.SetServiceName("WebAPIServerSnake"); //服务名称Type t = hostConfigurator.GetType();//Topshelf.HostConfigurators.HostConfiguratorImplConsole.WriteLine(t.ToString());hostConfigurator.Service<TownCrier>(s =>{s.ConstructUsing(name => new TownCrier());     //配置一个完全定制的服务,对Topshelf没有依赖关系。常用的方式。//the start and stop methods for the services.WhenStarted(tc => tc.Start());              //4s.WhenStopped(tc => tc.Stop());});}        }public class TownCrier{public TownCrier(){}public void Start(){Task.Factory.StartNew(() =>{bool IsStarted = false;while (!IsStarted){try{string log = "服务启动成功。";string urlKey = "ApiAddress";string portKey = "ApiPort";if (!ConfigurationManager.AppSettings.AllKeys.Contains(urlKey)){log = $"服务启动出现异常:App.config文件中不存在配置[{urlKey}]";Console.WriteLine(log);return;}if (!ConfigurationManager.AppSettings.AllKeys.Contains(portKey)){log = $"服务启动出现异常:App.config文件中不存在配置[{portKey}]";Console.WriteLine(log);return;}string apiUrl = ConfigurationManager.AppSettings[urlKey].ToString();string apiPort = ConfigurationManager.AppSettings[portKey].ToString();bool rtn = int.TryParse(apiPort, out int port);if (!rtn){log = $"服务启动出现异常:App.config文件中配置[{portKey}]值错误";Console.WriteLine(log);return;}StartOptions options = new StartOptions();//options.Urls.Add($"http://localhost:{apiPort}");options.Urls.Add($"http://127.0.0.1:{apiPort}");//options.Urls.Add($"http://{Environment.MachineName}:{apiPort}");if (!string.IsNullOrEmpty(apiUrl)){options.Urls.Add($"http://{apiUrl}:{apiPort}");}else{#region //自动绑定所有IPstring hostName = Dns.GetHostName();IPAddress[] iPAddresses = Dns.GetHostAddresses(hostName);foreach (IPAddress ipAddress in iPAddresses){//IPv4if (ipAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork){options.Urls.Add($"http://{ipAddress}:{apiPort}");}}#endregion}string urls = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(options.Urls);log = $"开始启动服务,服务地址:{urls}";Console.WriteLine(log);//OWIN 托管服务器问题:StartOptions WebApp.Start TargetInvocationException// Start OWIN host ,启动一个webapi程序//  public static IDisposable Start(string url, Action<IAppBuilder> startup);WebApp.Start(options, startup: Configuration);Console.WriteLine($"服务启动成功。");IsStarted = true;}catch (Exception ex){Console.WriteLine($"服务启动出现异常:{ex.Message}");Thread.Sleep(2000);}}});}public void Stop(){Console.WriteLine($"WebApi服务退出");}public void Configuration(IAppBuilder appBuilder){// Configure Web API for self-host. HttpConfiguration config = new HttpConfiguration();config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "{controller}/{action}/{id}",defaults: new { id = RouteParameter.Optional });appBuilder.UseWebApi(config);}}
}

 控制器类BridgeController如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;namespace BridgeApi
{[RoutePrefix("Bridge")]public class BridgeController : ApiController{/// <summary>/// 测试API端口,假设传入一个json字符串{"TestName":"斯内科"}/// 请求路由Url不区分大小写/// http://127.0.0.1:45678/Bridge/testApi/// </summary>/// <param name="json"></param>/// <returns></returns>[Route("TestApi")][HttpPost]public HttpResponseMessage TestApi(object objText) {try{Microsoft.Owin.OwinContext context = ((Microsoft.Owin.OwinContext)Request.Properties["MS_OwinContext"]);string RemoteClient = context.Request.RemoteIpAddress + ":" + context.Request.RemotePort;if (objText == null){string returnDataNG = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseContent(){Code = 12345,Message = $"解析失败,请求参数为空,源文本【{objText}】"});return new HttpResponseMessage(){Content = new StringContent(returnDataNG, System.Text.Encoding.UTF8, mediaType: "application/json")};}string json = objText.ToString();TestClass testClass = Newtonsoft.Json.JsonConvert.DeserializeObject<TestClass>(json);if (testClass == null || string.IsNullOrEmpty(testClass.TestName)){string returnDataNG = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseContent(){Code = 12345,Message = $"解析失败,TestName为空,源json【{json}】"});return new HttpResponseMessage(){Content = new StringContent(returnDataNG, System.Text.Encoding.UTF8, mediaType: "application/json")};}string returnData = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseContent(){Code = 0,Message = "",Data = $"接收到【{RemoteClient}】上抛数据【{json}】,已处理OK,返回一个随机数【{new Random().Next(1, 100)}】"});return new HttpResponseMessage(){Content = new StringContent(returnData, System.Text.Encoding.UTF8, mediaType: "application/json")};}catch (Exception ex) {string returnDataNG = Newtonsoft.Json.JsonConvert.SerializeObject(new ResponseContent(){Code = -1,Message = $"处理时出现错误【{ex.Message}】"});return new HttpResponseMessage(){Content = new StringContent(returnDataNG, System.Text.Encoding.UTF8, mediaType: "application/json"),StatusCode = HttpStatusCode.BadRequest};}}}public class TestClass{public string TestName { get; set; }}/// <summary>/// 接口反馈的响应内容对象/// </summary>public class ResponseContent {/// <summary>/// 错误号,code为0代表OK/// </summary>public int Code { get; set; }/// <summary>/// 错误描述,Code为0,这里显示空/// </summary>public string Message { get; set; }/// <summary>/// 相关数据信息,该Data可以是数组、键值对字典、字符串等任意类型数据/// </summary>public object Data { get; set; }}
}

运行,将其按照服务进行

使用PostMan测试WebApi 接口,如下

相关文章:

C#使用MVC框架创建WebApi服务接口

第一步,使用VS2019新建MVC-Web API应用程序 创建BridgeApi 第二步,运行将生成默认的示例网页,网页Url为 https://localhost:44361/home/index 右键 项目 添加 WebAPI控制器类 添加 我们可以看到App_Start目录下 有三个文件: BundleConfig.cs代表 捆绑文件的引用 有脚本文件…...

慧集通(DataLinkX)iPaaS集成平台-智能体(Agent)API

功能简介&#xff1a; 该功能下主要是用来管理集成平台对外开放接口得管控以及调用日志信息得查看操作&#xff0c;并支持日志得重放等操作&#xff1b;注&#xff1a;所有触发类单据得日志也可以在此查看(如使用数据触发组件自动触发流程得日志信息) 1.第三方调用接口类日志查…...

BigDecimal:高精度数值运算类

介绍&#xff1a; BigDecimal是一个用于高精度数值运算的类&#xff0c;它比基本的double或float类型更精确&#xff0c;非常适合需要精确计算的场景&#xff0c;如金融计算、科学计算等&#xff0c;因为这些领域对数值精度要求非常高&#xff0c;不能容忍浮点运算带来的误差。…...

11. C 语言 作用域与变量使用技巧

本章目录: 前言一、作用域的分类局部变量示例&#xff1a; 全局变量示例&#xff1a;示例&#xff1a; 形式参数示例&#xff1a; 二、作用域的细节与常见误区块级作用域示例&#xff1a; 静态变量与全局变量的对比示例&#xff1a; 未初始化变量的影响示例&#xff1a; 三、实…...

大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)

大模型WebUI&#xff1a;Gradio全解11——Chatbots&#xff1a;融合大模型的聊天机器人&#xff08;2&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...

课题推荐——基于GPS的无人机自主着陆系统设计

关于“基于GPS的无人机自主着陆系统设计”的详细展开&#xff0c;包括项目背景、具体内容、实施步骤和创新点。如需帮助&#xff0c;或有导航、定位滤波相关的代码定制需求&#xff0c;请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …...

HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构

HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构 效果图DRAWPIEHQChart代码地址后台数据对接说明示例数据数据结构说明效果图 DRAWPIE DRAWPIE是hqchart插件独有的绘制饼图函数,可以通过麦语法脚本来绘制一个简单的饼图数据。 饼图显示的位置固定在右上角。 下…...

张朝阳惊现CES展,为中国品牌 “代言”的同时,或将布局搜狐新战略!

每年年初&#xff0c;科技圈的目光都会聚焦在美国拉斯维加斯&#xff0c;因为这里将上演一场被誉为 “科技春晚” 的年度大戏 ——CES 国际消费电子展。作为全球规模最大、最具影响力的科技展会之一&#xff0c;CES 吸引了来自 160 多个国家的创新者和行业领导者&#xff0c;是…...

堆排序+选择排序详解

目录 1.选择排序的定义 2.选择排序的优缺点 2.1优点 2.2缺点 3.思考 4.优化后的选择排序的实现 5.选择排序的代码 6.堆排序 7.向上/向下调整算法 8. 向下向上调整代码 9.堆排序代码 1.选择排序的定义 选择排序(SelectSort)&#xff0c;以第一个为开始值&#xff0c…...

【Arthas命令实践】heapdump实现原理

&#x1f3ae; 作者主页&#xff1a;点击 &#x1f381; 完整专栏和代码&#xff1a;点击 &#x1f3e1; 博客主页&#xff1a;点击 文章目录 使用原理 使用 dump java heap, 类似 jmap 命令的 heap dump 功能。 【dump 到指定文件】 heapdump arthas-output/dump.hprof【只 …...

python-leetcode-判断子序列

392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09; class Solution:def isSubsequence(self, s: str, t: str) -> bool:i, j 0, 0 # i 指向 s&#xff0c;j 指向 twhile i < len(s) and j < len(t):if s[i] t[j]:i 1j 1return i len(s)...

【Verdi实用技巧-Part2】

Verdi实用技巧-Part2 2 Verdi实用技巧-Part22.1 Dump波形常用的task2.1.1 Frequently Used Dump Tasks2.1.2 Demo 2.2 提取波形信息小工具--FSDB Utilities2.3 Debug in Source code view2.3.1 Find Scopes By Find Scope form 2.3.2 Go to line in Souce code View2.3.3 Use B…...

常用的AT命令,用于查看不同类型的网络信息

文章目录 1. ATCSQ‌&#xff1a;2. ATCREG‌&#xff1a;‌3. ATCOPS‌&#xff1a;4. ATCGATT‌&#xff1a;5. ATCGPADDR‌&#xff1a; 在AT命令集中&#xff0c;用于查看网络信息的命令有多种&#xff0c;具体取决于所使用的设备和模块。以下是一些常用的AT命令&#xff0…...

【应用篇】09.实现简易的Shell命令行解释器

一、shell和bash的关系 shell是命令解释器&#xff0c;它接收用户的命令并将其传递给内核去执行。bash,即GNU Bourne-Again Shell&#xff0c;是shell的一种实现方式&#xff0c;也是大多数linux系统下默认的shell。 bash的原理 大多数的指令进程&#xff08;除了内建命令&…...

负载均衡技术【内网去外网运营商出口负载均衡】

1 负载均衡概述 LB&#xff08;Load Balance&#xff0c;负载均衡&#xff09;是一种集群技术&#xff0c;它将特定的业务&#xff08;网络服务、网络流量等&#xff09;分担给多台网络设备&#xff08;包括服务器、防火墙等&#xff09;或多条链路&#xff0c;从而提高了业务…...

【广西乡镇界】arcgis格式shp数据乡镇名称和编码2020年内容测评

【广西乡镇界】arcgis格式shp数据乡镇名称和编码2020年内容测评...

半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习

在半导体行业&#xff0c;工程师依靠 CP Yield&#xff08;生产过程中芯片的合格率&#xff09;、WAT&#xff08;晶圆验收测试&#xff09;和 Particle 的晶圆图模式来识别工艺问题。然而&#xff0c;在没有人工干预的情况下将这些晶圆图模式分类是一项重大挑战。许多论文都研…...

mongodb安装并设置用户验证登录

下载地址 https://www.mongodb.com/try/download/community-kubernetes-operator 偶数版是稳定版&#xff0c;基数版是开发版 &#xff0c;对32位支持不好 --------------------------------CentOS下安装mongodb--------------------------------------------------- 解压安装包…...

《零基础Go语言算法实战》【题目 1-16】字符串的遍历与比较

《零基础Go语言算法实战》 【题目 1-16】字符串的遍历与比较 给出两个字符串&#xff0c;请编写程序以确定能否将其中一个字符串重新排列后变成另一个字符串&#xff0c; 并规定大小写是不同的字符&#xff0c;空格也作为字符考虑。保证两个字符串的长度小于或等于 5000。 …...

VUE3封装一个Hook

在 Vue 3 中&#xff0c;Composition API 让我们能够封装和复用代码逻辑&#xff0c;尤其是通过 setup 函数进行组件间的复用。为了提高代码的可复用性&#xff0c;我们可以把一些常见的 API 请求和状态管理逻辑封装到一个单独的 hook 中。 以下是一个简单的例子&#xff0c;我…...

【Linux】Linux常见指令(上)

个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统&#xff0c;Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…...

嵌入式 C 语言:一维数组

目录 一、定义 二、内存布局 三、数组的初始化 3.1. 完全初始化 3.2. 部分初始化 3.3. 不指定大小初始化 四、使用数组 4.1. 访问数组元素 4.1.1. 通过索引访问数组元素 4.1.2. 通过指针访问数组元素 4.2. 遍历数组 4.3. 数组作为函数参数 五、应用场景 5.1. 数据…...

NineData云原生智能数据管理平台新功能发布|2024年12月版

本月发布 7 项更新&#xff0c;其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象&#xff0c;包括视图&#xff08;View&#xff09;、包&#xff08;Package&#xff09;、存储过程&#xff08;Procedur…...

iOS - 自旋锁

在 Objective-C 运行时中大量使用自旋锁&#xff0c;主要有以下几个原因&#xff1a; 1. 性能考虑 上下文切换成本 // 自旋锁实现 static ALWAYS_INLINE void OSSpinLockLock(volatile OSSpinLock *lock) {do {while (lock->value ! 0) {__asm__ volatile ("pause&q…...

域名备案页面模板

域名备案模板&#xff0c;首页底下正中央位置需要有备案号。 主要是给不太擅长于前端样式的人提供一个备案模板&#xff0c;直接把这个H5放到nginx的index.html就可以访问了 <html><body><div class"login-container"><h2>登录</h2>&…...

【socketioxide和axum集成-实现websocket实时通信-Rust点滴】

socketioxide的axum集成 启动socketio依靠examle里的layer一. 使用可变State依靠axum里的example二.提取client,IP1. 非代理,tcp,socket对方地址2.代理情况下socket.req_parts. 三. axum的handle中使用emit发送消息.1. io,存入State解决.2.把io存入初始设定作为唯一单例3.http-…...

计算机网络(第8版)第3章--PPP课后习题

【3-09】 一 个PPP 帧的数据部分(用十六进制写出)是7 D 5EFE 277D 5D7D 5D657D 5E。 试问真正的数据是什么(用十六进制写出)? 解答&#xff1a;把由转义符7D开始的2字节序列用下画线标出&#xff1a; 7D 5E FE 27 7D 5D 7D 5D 65 7D 5E 7D 5E应当还原成为7E。 7D5D 应…...

通过Android Studio修改第三方jar包并重新生成jar包

最近接手了来自公司其他同事的一个Unity项目,里面有一个封装的jar包要改动一下,无奈关于这个jar包的原工程文件丢失了,于是自己动手来修改下jar包,并做下记录。 一、导入第三方jar包 1、新建项目EditJarDemo(项目名随便取) 2、新建libs文件夹,把你要修改的third.jar 复制…...

Rabbitmq 业务异常与未手动确认场景及解决方案

消费端消费异常&#xff0c;业务异常 与 未手动确认是不是一个场景&#xff0c;因为执行完业务逻辑&#xff0c;再确认。解决方案就一个&#xff0c;就是重试一定次数&#xff0c;然后加入死信队列。还有就是消费重新放入队列&#xff0c;然后重新投递给其他消费者&#xff0c;…...

3D机器视觉的类型、应用和未来趋势

3D相机正在推动机器视觉市场的增长。很多制造企业开始转向自动化3D料箱拣选&#xff0c;专注于使用3D视觉和人工智能等先进技术来简化操作并减少开支。 预计3D相机将在未来五年内推动全球机器视觉市场&#xff0c;这得益于移动机器人和机器人拣选的强劲增长。到 2028 年&#…...

LabVIEW在反馈控制时如何解决带约束的控制问题

在LabVIEW中&#xff0c;解决带约束的反馈控制问题通常需要使用先进的控制算法或特定的方法来满足约束条件&#xff0c;同时保证控制系统的性能和稳定性。以下是解决这类问题的一些常用方法和步骤&#xff1a; ​ 1. 定义控制问题及约束条件 确定被控对象的动态特性&#xff08…...

PHP 在 2025 年的现状与展望

PHP 在 2025 年依然强劲&#xff0c;继续为超过 77% 使用已知服务器端编程语言的网站提供动力。这并非仅仅依靠遗留代码&#xff0c;像 WordPress、Shopify 和 Laravel 这样的主流平台持续推动 PHP 的发展&#xff0c;使其保持着 актуальность 并不断进化。 为什么…...

QT c++ 自定义按钮类 加载图片 美化按钮

如果你有需要利用图片美化按钮的情况&#xff0c;本文能帮助你。 鼠标左键按下按钮和松开&#xff0c;按钮显示不同的图片。 1.按钮类 //因为此类比较简单&#xff0c;1个头文件搞定&#xff0c;没有cpp文件 #ifndef CUSTOMBUTTON_H #define CUSTOMBUTTON_H #include <Q…...

夯实前端基础之HTML篇

知识点概览 HTML部分 1. DOM和BOM有什么区别&#xff1f; DOM&#xff08;Document Object Model&#xff09; 当网页被加载时&#xff0c;浏览器会创建页面的对象文档模型&#xff0c;HTML DOM 模型被结构化为对象树 用途&#xff1a; 主要用于网页内容的动态修改和交互&…...

pytest 参数介绍

命令行参数描述常见使用案例-v / --verbose显示每个测试用例的详细信息&#xff0c;包括测试名称和状态pytest -v-s / --captureno禁用输出捕获&#xff0c;允许 print() 输出显示pytest -s-q / --quiet安静模式&#xff0c;减少输出&#xff0c;仅显示每个测试的通过/失败结果…...

蓝桥杯训练

1对于一个字母矩阵&#xff0c;我们称矩阵中的一个递增序列是指在矩阵中找到两个字母&#xff0c;它们在同一行&#xff0c;同一列&#xff0c;或者在同一 45 度的斜线上&#xff0c;这两个字母从左向右看、或者从上向下看是递增的。 例如&#xff0c;如下矩阵中 LANN QIAO有…...

maven的简单介绍

目录 1、maven简介2、maven 的主要特点3、maven的下载与安装4、修改配置文件5、私服(拓展) 1、maven简介 Maven 是一个广泛使用的项目管理和构建工具&#xff0c;主要应用于 Java 项目。Maven 由 Apache 软件基金会开发和维护&#xff0c;它提供了一种简洁且一致的方法来构建、…...

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题&#xff0c;可以利用Github Action将需要的镜像转存到阿里云私有仓库&#xff0c;然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址&#xff1a;使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…...

Kafka优势剖析-消费者组、并行消费

目录 1. 消费者组&#xff08;Consumer Group&#xff09; 1.1 什么是消费者组&#xff1f; 1.2 消费者组的工作原理 1.3 消费者组的优势 2. 并行消费&#xff08;Parallel Consumption&#xff09; 2.1 什么是并行消费&#xff1f; 2.2 并行消费的工作原理 2.3 并行消…...

MATLAB语言的多线程编程

MATLAB语言的多线程编程 引言 随着计算机技术的不断发展&#xff0c;尤其是在大数据和高性能计算领域&#xff0c;多线程编程逐渐成为一种重要的编程范式。MATLAB作为一种广泛应用于科学计算和工程模拟的高级编程语言&#xff0c;其强大的数学计算功能和丰富的工具箱&#xf…...

强化学习入门

RL学习路径 理解DQN原理 理解 标准版的策略梯度算法(Vanilla Policy Gradient) 模仿学习实践 Actor-Critic原理 从大模型机器人到imitation Learning与diffusion policy、ACT(Action Chunking with Transformers)的关系 大模型与机器人 tmp: 强化学习中的优势函数&#…...

Unity 2d描边基于SpriteRender,高性能的描边解决方案

目标 以Unity默认渲染管线为例&#xff0c;打造不需要图片内边距&#xff0c;描边平滑&#xff0c;高性能的描边解决方案 前言 在2d游戏中经常需要给2d对象添加描边&#xff0c;来突出强调2d对象 当你去网上查找2d描边shader&#xff0c;移植到项目里面&#xff0c;大概率会…...

2025第2周 | JavaScript中的Symbol

目录 1. Symbol是个什么东东&#xff1f;1.1 语法 2. 为什么需要Symbol?3. 怎么使用Symbol?3.1 定义对象字面量3.2 新增对象属性3.3 使用 Object.defineProperty方式3.4 遍历 4. 静态方法4.1 Symbol.for(key)4.2 Symbol.keyFor(symbol) 2025&#xff0c;做想做的事&#xff0…...

Unity学习之UGUI进阶

一、事件监听接口 1、作用 用于实现类型长按、双击、拖拽等基础控件无法实现的功能 所有控件都能够添加更多的事件监听来处理对应的逻辑 2、事件监听接口类型 &#xff08;1&#xff09;常用事件接口 &#xff08;2&#xff09;不常用事件接口 3、使用事件监听接口 &#…...

IT面试求职系列主题-Jenkins

想成功求职&#xff0c;必要的IT技能一样不能少&#xff0c;先说说Jenkins的必会知识吧。 1) 什么是Jenkins Jenkins 是一个用 Java 编写的开源持续集成工具。它跟踪版本控制系统&#xff0c;并在发生更改时启动和监视构建系统。 2&#xff09;Maven、Ant和Jenkins有什么区别…...

Allure 集成 pytest

Allure 是一个强大的测试报告工具&#xff0c;与 pytest 集成可以生成详细的测试报告&#xff0c;包括测试步骤、测试数据、截图、错误堆栈等。 1. 安装 Allure 和相关依赖 安装 pytest-allure-adaptor 插件&#xff1a; pip install allure-pytest确保本地已安装 Allure 工具。…...

Redis高频知识点

Redis 目录 1 Redis是AP的还是CP的&#xff1f;2 介绍一下Redis的集群方案&#xff1f;3 什么是Redis的数据分片&#xff1f;4 Redis为什么这么快&#xff1f;5 Redis 的事务机制是怎样的&#xff1f;7 Redis的持久化机制是怎样的&#xff1f;8 Redis 的过期策略是怎么样的&a…...

【电子通识】PWM驱动让有刷直流电机恒流工作

电机的典型驱动方法包括电压驱动、电流驱动以及PWM驱动。本文将介绍采用PWM驱动方式的恒流工作。 首先介绍的是什么是PWM驱动的电机恒流工作&#xff0c;其次是PWM驱动电机恒流工作时电路的工作原理。 PWM驱动 当以恒定的电流驱动电机时&#xff0c;电机会怎样工作呢&#xff1…...

PyMysql 02|(包含项目实战)数据库工具类封装

目录 七、数据库工具类封装 1、封装的目的 2、设计数据库工具类 3、实现类方法 1️⃣获取、关闭连接 2️⃣查询一条记录 3️⃣增删改数据 4️⃣完整封装代码实现 七、数据库工具类封装 1、封装的目的 将常用的数据库操作&#xff0c;封装到一个方法。 后续再操作数据…...

Pixel 6a手机提示无法连接移动网络,打电话失败!

1、开启VoLTE 2、如果没有&#xff0c;下载shizuku和PixelIMS应用。 shizuke Releases RikkaApps/Shizuku GitHub PixellMS Release v1.2.8 kyujin-cho/pixel-volte-patch GitHub 3、安装shizuke启动&#xff0c;开通root可以直接点击下面的启动&#xff0c;如果没有就…...