ASP.NET Core与GraphQL集成
一、引言:探索 C# 与ASP.NET Core、GraphQL 的协同魅力
在当今数字化浪潮中,Web 开发领域不断演进,新技术层出不穷。C# 作为.NET 平台上的中流砥柱,凭借其强大的功能与优雅的语法,成为众多开发者构建各类应用程序的得力工具。ASP.NET Core 更是异军突起,这个跨平台、高性能、开源的 Web 框架,为现代云基础 Web 应用程序的开发注入了强大动力,无论是复杂的企业级系统,还是灵活的小型项目,它都能轻松驾驭。
而 GraphQL 的出现,宛如一场革新风暴,席卷了 API 交互的传统模式。它由 Facebook 精心打造,赋予客户端精准定制数据需求的 “超能力”,让数据获取变得前所未有的高效、灵活与直观。以往,客户端常常陷入要么数据冗余、要么频繁多次请求的困境,GraphQL 的诞生彻底打破了这一僵局,只需一次请求,客户端就能精准 “捕捞” 所需数据,服务器也得以精准 “投喂”,大大提升了开发效率与用户体验。
当 C#、ASP.NET Core 与 GraphQL 三者携手,更是开启了一扇通往全新 Web 开发体验的大门。它们的融合,不仅是技术的简单叠加,更是优势互补、相得益彰,能够满足日益复杂多变的业务需求,为开发者提供更强大的武器,助力打造出更具竞争力的 Web 应用。接下来,就让我们一同深入探究它们集成的奇妙之旅。
二、C#:.NET 世界的中流砥柱
C# 作为一门由微软精心研发的面向对象编程语言,自诞生之初便备受瞩目。它汲取了 C 和 C++ 的强大精髓,去除了诸如宏、多重继承等复杂且易出错的特性,以一种更为简洁、优雅的姿态呈现在开发者面前。其语法风格与 Java 有诸多相似之处,对于熟悉 C 系语言的开发者而言,上手极为容易,这大大降低了学习成本,使得开发者能快速投入项目开发。
在类型安全方面,C# 堪称典范。编译时严格的类型检查机制,如同一位严谨的卫士,提前排查出潜在的类型错误,确保程序运行的稳定性。例如,在变量赋值、方法参数传递等场景下,一旦类型不匹配,编译器便会及时发出警报,让开发者能迅速定位并修正问题,避免错误蔓延至运行阶段,有效提升了代码的可靠性。
C# 的跨平台能力更是为其拓展了广阔的应用天地。依托于.NET Core(以及后续的.NET 5 + 统一平台),它打破了以往 Windows 平台的限制,成功登陆 Linux、macOS 等多个操作系统舞台。这一跨越意味着开发者能够基于熟悉的 C# 语言,开发出在不同环境下无缝运行的应用程序,无论是企业级的后端服务,还是跨平台的桌面应用,C# 都能轻松驾驭。在 Web 开发领域,结合ASP.NET Core,C# 更是如鱼得水,为构建高性能、高扩展性的 Web 应用提供了坚实支撑,诸多大型企业级 Web 系统的成功案例,便是其卓越实力的有力见证。
三、ASP.NET Core:现代化 Web 开发利器
ASP.NET Core 宛如一把瑞士军刀,集众多卓越特性于一身,为现代 Web 开发开辟了广阔天地。
跨平台特性无疑是其一大显著优势。摒弃了以往ASP.NET对 Windows 平台的依赖,ASP.NET Core 基于.NET Core 框架,得以在 Windows、Linux、macOS 以及 Docker 等多种环境中自由驰骋。这意味着开发者能够依据团队技术偏好、项目部署需求,灵活选择开发与运行平台,无论是在企业级服务器的 Linux 环境,还是个人开发者的 macOS 系统上,都能无缝搭建和运行ASP.NET Core 应用,大大拓宽了应用的部署边界,降低了因平台限制带来的额外成本。
高性能表现让ASP.NET Core 在 Web 开发领域脱颖而出。它引入了创新的异步编程模型,如同给应用装上了高速引擎,能充分利用系统多核 CPU 资源,在处理高并发请求时游刃有余,极大提升了应用的响应速度与吞吐量。内置的依赖注入机制则像是一位智能管家,精准管理对象间的依赖关系,减少不必要的对象创建与销毁开销,优化资源利用。其轻量级的架构设计,削减了冗余的中间件与组件,使得代码执行路径更加精简高效。对 HTTP 响应的优化,更是进一步减少了网络请求与响应的耗时,确保数据能够以最快速度抵达客户端,为用户带来流畅的交互体验。
在架构层面,ASP.NET Core 采用开放式和模块化设计理念,犹如一套精致的积木组合。各个组件相互解耦,开发者如同搭建积木一般,能够根据项目实际需求,从丰富的组件库中随心挑选所需模块,轻松集成第三方库,快速搭建出定制化的 Web 应用架构。这种灵活性不仅提升了开发效率,还使得应用架构易于维护与扩展,能够随着业务的发展不断进化。
内置的诸多实用功能,更是为开发者提供了一站式开发体验。内置的依赖注入容器,让对象的生命周期管理变得轻而易举,实现了代码的低耦合,便于单元测试与集成测试的开展;全新的 MVC 框架和 Web API 框架,兼顾了页面展示与数据接口开发需求,无论是构建传统的 Web 应用,还是面向前后端分离的 API 服务,都能找到对应的便捷工具;统一的配置模型支持 JSON、XML、环境变量等多种配置源,开发者可以根据不同场景灵活切换,轻松管理应用的各类配置信息;强大的内置安全性功能,涵盖身份验证、授权以及防范跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等常见 Web 攻击手段,为应用筑牢安全防线,让开发者无需过多担忧安全漏洞,专注于业务功能开发;与现代化前端开发技术(如 Angular、React 和 Vue.js)的紧密集成,则打通了前后端开发的壁垒,便于构建功能丰富、交互流畅的富客户端应用程序,满足当下用户对 Web 应用日益增长的体验需求。
四、GraphQL:API 查询的革新力量
GraphQL 的工作原理宛如一场精心编排的舞蹈,涉及多个关键角色协同运作。首先,Schema 作为整个流程的蓝图,精心勾勒出 API 所涵盖的数据类型以及它们之间错综复杂的关系网络,这是服务器与客户端之间达成默契的契约,确保双方对数据的理解一致。Query 则是客户端发起数据请求的冲锋号,明确告知服务器所需的数据内容;Mutation 如同一位神奇的魔法师,负责对数据进行修改、新增等变更操作,让数据世界能够与时俱进;而 Resolvers 更像是一群幕后英雄,每个 Resolver 函数紧密关联着 Schema 中的字段,当接收到查询请求时,它们迅速出动,精准地从各类数据源(如数据库、其他 API 等)抓取对应的数据。
与传统的 REST API 相比,GraphQL 的优势尽显无疑。传统 REST API 往往基于固定的端点,每个端点返回的数据结构相对固定,客户端只能被动接受服务器提供的 “套餐”,这就容易导致数据冗余或不足。例如,在一个社交应用中,若前端仅需展示用户的基本信息(姓名、头像)和最新一条动态,使用 REST API 可能不得不请求整个用户资料接口,连带返回诸多不必要的信息,如用户的历史动态列表、隐私设置等,造成带宽浪费;而 GraphQL 则允许客户端像点菜一样,精确指定 “姓名”“头像”“最新动态” 这些字段,服务器依此精准提供数据,大大提升了传输效率。
再者,在处理复杂关联数据时,传统 REST API 常常捉襟见肘。若一个页面需要同时展示一篇文章、作者信息以及文章所属分类,使用 REST API 可能需要分别向文章接口、作者接口、分类接口发起多次请求,这不仅增加了网络开销,还可能因请求顺序不当导致延迟。GraphQL 却能在一次请求中巧妙地通过嵌套查询,如 “query { article (id: 1) { title, author { name, avatar }, category { name } } }”,将所需数据一次性精准获取,大幅提升了响应速度,优化了用户体验,为现代 Web 开发注入了全新活力,成为应对复杂数据交互场景的得力工具。
五、集成实战:步步为营搭建强大 Web 应用
(一)准备工作:搭建ASP.NET Core 项目根基
首先,我们需要搭建ASP.NET Core 项目的基础框架。若你习惯使用 Visual Studio,只需打开它,点击 “创建新项目”,在项目模板中选择 “ASP.NET Core Web API”,按照向导一步步配置项目名称、存储路径等信息,即可轻松创建项目。例如,将项目命名为 “MyGraphQLApp”,存储在指定的代码文件夹中。
要是你钟情于命令行操作,也同样便捷。打开终端,输入 “dotnet new webapi -n MyGraphQLApp”,瞬间便能创建一个名为 “MyGraphQLApp” 的ASP.NET Core Web API 项目。接着进入项目目录 “cd MyGraphQLApp”,确保项目结构完整,各类默认文件就位,为后续集成 GraphQL 做好充分准备,就像为一座大厦打下坚实的地基。
(二)引入 GraphQL:安装必备 NuGet 包
项目框架搭好后,就轮到引入 GraphQL 相关的 NuGet 包了。这一步至关重要,如同为项目注入神奇的魔力。我们需要安装 “Microsoft.AspNetCore.GraphQL” 和 “GraphQL” 这两个核心包,它们分别提供了ASP.NET Core 与 GraphQL 集成的关键功能以及 GraphQL 的基础运行支持。
在 Visual Studio 中,打开 “NuGet 包管理器控制台”,输入 “Install-Package Microsoft.AspNetCore.GraphQL” 和 “Install-Package GraphQL”,回车后,Visual Studio 会自动从 NuGet 服务器下载并安装这两个包及其依赖项,安装完成后,项目就能识别和使用 GraphQL 相关的类与功能。
使用命令行的开发者,在项目目录下执行 “dotnet add package Microsoft.AspNetCore.GraphQL” 和 “dotnet add package GraphQL”,同样能快速完成安装,为后续的开发工作铺就道路,让项目具备处理 GraphQL 请求的能力。
(三)定义数据模型:GraphQL 类型映射
接下来,要在ASP.NET Core 项目中定义 GraphQL 类型,这些类型将紧密映射到我们的数据模型,无论是数据库表对应的实体类,还是业务逻辑中的复杂对象。假设我们正在开发一个图书管理系统,有 “Book” 数据模型,其包含 “Title”(书名)、“Author”(作者)、“PublicationDate”(出版日期)等属性。
在 C# 代码中,创建一个 “BookType” 类,继承自 “ObjectGraphType”:
public class BookType : ObjectGraphType<Book>
{public BookType(){Field(x => x.Title);Field(x => x.Author);Field(x => x.PublicationDate);}
}
这里的每个 “Field” 定义,就如同在 GraphQL 的世界里为 “Book” 类型开辟了对应的字段通道,使得 GraphQL 能够精准识别和处理 “Book” 数据模型中的各个属性,确保数据在 API 交互中能准确无误地流动,为客户端提供所需的图书信息。
(四)构建 GraphQL Schema:API 蓝图绘制
有了数据模型对应的 GraphQL 类型,接着就要构建 GraphQL Schema,它堪称整个 GraphQL API 的蓝图,精心定义了 API 的结构与行为。在ASP.NET Core 项目的启动配置类 “Startup.cs” 中,进行如下配置:
public void ConfigureServices(IServiceCollection services)
{services.AddControllers();services.AddGraphQLServer().AddQueryType<Query>() .AddMutationType<Mutation>() .AddSubscriptionType<Subscription>();
}
这里,“Query” 类型负责处理数据查询请求,比如获取所有图书列表、根据 ID 查询特定图书;“Mutation” 类型专注于数据变更操作,像新增一本图书、更新图书信息等;“Subscription” 类型则为实时数据更新提供支持,例如当有新书入库时,能实时推送给订阅的客户端。
以 “Query” 为例,创建一个 “Query” 类:
public class Query
{private readonly IBookService _bookService;public Query(IBookService bookService){_bookService = bookService;}public IEnumerable<Book> GetBooks() => _bookService.GetAllBooks();public Book GetBookById(int id) => _bookService.GetBookById(id);
}
通过依赖注入引入 “IBookService” 来获取图书数据,定义的查询方法与之前的 “BookType” 紧密配合,让客户端能够通过 GraphQL 查询到精准的图书信息,使得整个 GraphQL API 的功能布局一目了然,为后续的数据交互奠定坚实基础。
(五)配置 GraphQL 服务:打通ASP.NET Core 与 GraphQL 链路
继续在 “Startup.cs” 文件中,除了定义 Schema 相关的服务,还需配置 GraphQL 中间件,以打通ASP.NET Core 与 GraphQL 之间的请求处理链路。在 “Configure” 方法中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapControllers();endpoints.MapGraphQL(); });
}
“MapGraphQL” 方法的调用,将 GraphQL 的请求处理端点注册到ASP.NET Core 的请求管道中。这意味着当客户端发送 GraphQL 请求时,ASP.NET Core 能够准确识别并将请求转交给 GraphQL 进行处理,确保整个数据交互流程顺畅无阻,就像在两个城市之间搭建了一条高速公路,数据得以快速奔驰。
(六)编写查询与变更:实现数据交互
万事俱备,接下来编写 GraphQL 查询和变更操作,让客户端能够与服务器进行高效的数据交互。
查询方面,假设客户端想要获取所有图书信息,对应的 GraphQL 查询语句如下:
query {books {titleauthorpublicationDate}
}
而在 C# 代码的 “Query” 类中,通过之前定义的 “GetBooks” 方法,从数据源(如数据库)获取图书列表,并依据 “BookType” 的定义,将数据精准包装成 GraphQL 格式返回给客户端。
变更操作同样精彩,比如新增一本图书:
mutation {addBook(title: "新书名", author: "新作者", publicationDate: "2023-01-01") {titleauthorpublicationDate}
}
在 C# 的 “Mutation” 类中:
public class Mutation
{private readonly IBookService _bookService;public Mutation(IBookService bookService){_bookService = bookService;}public Book AddBook(string title, string author, DateTime publicationDate){var newBook = new Book{Title = title,Author = author,PublicationDate = publicationDate};return _bookService.AddBook(newBook);}
}
借助 “IBookService” 将新图书数据存入数据源,并把新增后的图书信息返回给客户端,实现数据的精准修改与实时反馈,让 Web 应用的数据操作变得灵活自如。
(七)测试 GraphQL API:确保功能正常
代码编写完成,测试环节至关重要。我们可以使用 GraphQL Playground 这款强大的工具,它提供了一个可视化的界面,方便我们编写和发送 GraphQL 查询与变更请求。
启动ASP.NET Core 项目后,在浏览器中访问项目对应的 GraphQL Playground 地址(通常是 “https://localhost:[端口号]/graphql”),进入界面后,在左侧编辑区输入之前编写的查询语句,如获取所有图书信息的查询,点击 “执行” 按钮,右侧结果区便能瞬间展示从服务器返回的数据,包括每本书的书名、作者、出版日期等详细信息,直观验证查询功能是否正常。
对于变更操作,同样在编辑区输入新增图书的 mutation 语句,执行后,可再次通过查询语句验证新图书是否成功入库。此外,还可以使用 Postman 等通用的 HTTP 客户端工具,按照 GraphQL 的请求规范,发送 POST 请求并携带查询或变更内容,从不同角度确保 GraphQL API 的稳定性与正确性,为项目上线筑牢防线。
六、优化与进阶:提升应用性能与扩展性
(一)性能优化策略:让 API 飞起来
随着应用的发展与用户量的增长,性能优化成为关键一环。合理运用缓存机制是提升性能的利器。在ASP.NET Core 项目中,我们可以借助内置的缓存组件,如 MemoryCache 或 DistributedCache。以查询图书信息为例,对于频繁访问且更新不频繁的热门图书数据,在查询解析器中引入缓存逻辑:
public class BookResolver
{private readonly IMemoryCache _cache;private readonly IBookService _bookService;public BookResolver(IMemoryCache cache, IBookService bookService){_cache = cache;_bookService = bookService;}public async Task<Book> GetBookById(int id){if (_cache.TryGetValue<Book>($"book_{id}", out var book)){return book;}book = await _bookService.GetBookById(id);_cache.Set($"book_{id}", book, TimeSpan.FromMinutes(10));return book;}
}
这样,当多次查询同一本图书时,只需首次从数据源获取,后续直接从缓存中快速提取,大大减少了数据库查询开销,提升响应速度。
数据加载优化也至关重要,避免 “N + 1 查询问题”。假设我们的图书与作者是多对一关系,在查询多本图书及其作者信息时,若不优化,每查询一本图书就会额外触发一次查询作者的操作。利用GraphQL.NET提供的 DataLoader 技术,我们可以批量加载数据。首先定义一个用于批量加载作者信息的 DataLoader:
public class AuthorDataLoader : BatchDataLoader<int, Author>
{private readonly IAuthorService _authorService;public AuthorDataLoader(IAuthorService authorService, IBatchScheduler batchScheduler, DataLoaderOptions options = null) : base(batchScheduler, options){_authorService = authorService;}protected override async Task<IReadOnlyDictionary<int, Author>> LoadBatchAsync(IReadOnlyList<int> keys, CancellationToken cancellationToken){var authors = await _authorService.GetAuthorsByIds(keys);return authors.ToDictionary(a => a.Id);}
}
在图书查询解析器中使用它:
public class BookResolver
{private readonly AuthorDataLoader _authorDataLoader;private readonly IBookService _bookService;public BookResolver(AuthorDataLoader authorDataLoader, IBookService bookService){_authorDataLoader = authorDataLoader;_bookService = bookService;}public async Task<Book> GetBookById(int id){var book = await _bookService.GetBookById(id);var author = await _authorDataLoader.LoadAsync(book.AuthorId);book.Author = author;return book;}
}
如此,无论查询多少本图书,都能将作者信息的查询合并为一次批量操作,显著提升性能。
优化查询本身也能带来巨大收益。对于复杂的嵌套查询,合理运用 GraphQL 的片段(Fragment)功能,减少重复字段的请求。比如在查询包含图书详情、作者信息、分类信息的场景:
fragment BookDetails on Book {titlepublicationDate
}fragment AuthorDetails on Author {namebio
}query {books {...BookDetailsauthor {...AuthorDetails}category {name}}
}
通过定义片段,清晰复用公共字段,不仅使查询语句简洁易维护,还能精准控制数据获取,减少不必要的数据传输,让 API 响应更加高效。
(二)认证与授权:保障 API 安全
在开放的网络环境中,保护 GraphQL API 的安全至关重要,ASP.NET Core 为我们提供了强大的安全防护体系。
身份验证方面,常见的 JWT(JSON Web Token)认证是不错的选择。在 Startup.cs 中进行配置:
public void ConfigureServices(IServiceCollection services)
{services.AddAuthentication(options =>{options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;}).AddJwtBearer(options =>{options.TokenValidationParameters = new TokenValidationParameters{ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ValidateIssuerSigningKey = true,ValidIssuer = Configuration["Jwt:Issuer"],ValidAudience = Configuration["Jwt:Audience"],IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))};});services.AddGraphQLServer().AddQueryType<Query>().AddMutationType<Mutation>();
}public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseAuthentication();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();endpoints.MapGraphQL();});
}
这一系列配置启用了 JWT 认证中间件,确保只有携带有效 JWT Token 的请求才能访问 GraphQL API,如同在 API 入口设置了严格的门禁。
授权环节同样关键,基于角色的访问控制(RBAC)是常用策略。例如,在图书管理系统中,定义 “管理员” 角色具有新增、删除图书的权限,普通用户仅有查询权限。在 GraphQL 查询或变更类型中使用 [Authorize] 属性:
public class Mutation
{private readonly IBookService _bookService;public Mutation(IBookService bookService){_bookService = bookService;}[Authorize(Roles = "Admin")]public Book AddBook(string title, string author, DateTime publicationDate){var newBook = new Book{Title = title,Author = author,PublicationDate = publicationDate};return _bookService.AddBook(newBook);}
}
如此一来,普通用户发起新增图书的 mutation 请求时,会因未满足角色要求而被拒绝,确保数据操作的安全性,让 GraphQL API 在高效运行的同时坚如磐石。
七、总结与展望:开启 Web 开发新篇章
至此,我们一同走过了 C# 与ASP.NET Core 和 GraphQL 集成的精彩旅程。从最初搭建ASP.NET Core 项目根基,到精心引入 GraphQL,逐步定义数据模型、绘制 GraphQL Schema、打通链路、实现数据交互,再到后期的性能优化与安全加固,每一步都凝聚着开发者的智慧与汗水,也彰显了这三项技术融合的强大魅力。
通过集成,我们成功打造出更具灵活性、高效性的 Web 应用。客户端不再受困于冗余或不足的数据获取,能够精准掌控所需;服务器端资源得以更合理利用,减少不必要的开销,提升响应速度,在高并发场景下也能从容应对。无论是应对复杂多变的业务逻辑,还是满足用户日益苛刻的交互体验需求,这一技术组合都展现出卓越的适应性。
展望未来,随着技术的持续进步,C#、ASP.NET Core 与 GraphQL 的融合必将迈向新高度。在微服务架构盛行的当下,它们能助力构建更加松散耦合、易于扩展的微服务体系,每个服务独立演进,又能通过 GraphQL 高效整合数据,为大型分布式系统提供坚实支撑。人工智能与大数据的浪潮中,利用 C# 强大的计算能力、ASP.NET Core 稳定的后端承载,结合 GraphQL 精准的数据提取,能快速从海量数据中为 AI 模型提供关键训练素材,加速智能化应用落地。物联网领域,面对海量设备产生的碎片化数据,借助 GraphQL 灵活的数据组织形式,配合ASP.NET Core 跨平台的物联网网关搭建能力,C# 高效的数据处理逻辑,实现设备数据的快速汇聚、分析与反馈,赋能智能工厂、智慧城市等场景蓬勃发展。
这是一个充满无限可能的时代,C#、ASP.NET Core 与 GraphQL 为开发者打开了一扇通往创新世界的大门。愿每一位开发者都能在这片技术海洋中乘风破浪,挖掘更多潜力,创造出令人惊叹的 Web 应用佳作,推动行业迈向全新的巅峰。
相关文章:
ASP.NET Core与GraphQL集成
一、引言:探索 C# 与ASP.NET Core、GraphQL 的协同魅力 在当今数字化浪潮中,Web 开发领域不断演进,新技术层出不穷。C# 作为.NET 平台上的中流砥柱,凭借其强大的功能与优雅的语法,成为众多开发者构建各类应用程序的得…...
Zabbix 从入门到精通
一、Zabbix 简介 1.1 什么是 Zabbix Zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级开源解决方案。它能监控各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位 / 解决存在的各种问题。 1…...
文生图模型的技术原理、训练方案与微调方案
文生图模型的技术原理、训练方案与微调方案 引言 文生图(Text-to-Image)模型是一类能够根据文本描述生成对应图像的深度学习模型。近年来,随着生成对抗网络(GANs)和扩散模型(Diffusion Models)等技术的进步,文生图模型在图像生成领域取得了显著的进展。本文将详细介绍…...

3_CSS3 渐变 --[CSS3 进阶之路]
CSS3 引入了渐变(gradients),它允许在两个或多个指定的颜色之间显示平滑的过渡。CSS3 支持两种类型的渐变: 线性渐变(Linear Gradients):颜色沿着一条线性路径变化,可以是水平、垂直…...
国内主流的Spring微服务方案指南
构建一个完整的 Spring 微服务方案涉及多个关键组件的集成与配置,包括服务注册与发现、配置管理、API 网关、负载均衡、服务调用、熔断与限流、消息中间件、分布式追踪、服务网格、容器编排以及数据库与缓存等。以下将结合前述内容,详细介绍一个完整的中…...
docker更换镜像源脚本
Ubuntu / Debian 系统下的脚本 sudo curl -fsSL http://luyuanbo79.iepose.cn/wenjian/docker%20jingxiangyuan/Ubuntu-Debian.sh | sh CentOS / RHEL 系统下的脚本 sudo curl -fsSL\n\nhttp://luyuanbo79.iepose.cn/wenjian/docker%20jingxiangyuan/CentOS%20%20RHEL.sh | …...

Java Web开发进阶——错误处理与日志管理
错误处理和日志管理是任何生产环境中不可或缺的一部分。在 Spring Boot 中,合理的错误处理机制不仅能够提升用户体验,还能帮助开发者快速定位问题;而有效的日志管理能够帮助团队监控应用运行状态,及时发现和解决问题。 1. 常见错误…...

计算机网络 笔记 网络层1
网络层功能概述 主要的任务是把分组从源端传输到目的端,为分组交换网上的不同主句提供通信服务,网络层的传输单位是数据报。 主要的功能; 1,路由选择:路由选择指网络层根据特定算法,为数据包从源节点到目…...

【论文笔记】多个大规模数据集上的SOTA绝对位姿回归方法:Reloc3r
abstract 视觉定位旨在确定查询图像相对于姿势图像数据库的相机姿势。 近年来,直接回归相机姿势的深度神经网络由于其快速推理能力而受到欢迎。 然而,现有方法很难很好地推广到新场景或提供准确的相机姿态估计。 为了解决这些问题,我们提出了…...

springMVC---常用注解
目录 一、创建项目 1.依赖 2.web.xml 3.spring-mvc.xml 二、RequestParam注解 1.作用 2.属性 3.代码 DeptController类 启动tomcat 三、RequestBody注解 1.作用 2.属性 3.代码 (1)DeptController类 (2)index.jsp (3)启动tomcat 四、P…...
青龙面板脚本开发指南:高效自动化任务的实现
青龙面板脚本开发指南:高效自动化任务的实现 青龙面板(Qinglong Panel)是一款强大的任务管理平台,支持多种语言的脚本开发和执行。通过在青龙面板中编写和管理脚本,用户可以轻松实现自动化任务,提高工作效…...
深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理
DICOM医学影像中的定位线(Localization Line) 在医学影像学中,DICOM是用于存储和交换医学影像的标准格式。定位线(Localization Line)在医学影像的显示和分析中起着重要作用,它帮助医生和医学专业人员在影像中精确地标定重要的解剖结构、区域或特征,辅助进行定位、治疗计…...

网络应用技术 实验七:实现无线局域网
一、实验简介 在 eNSP 中构建无线局域网,并实现全网移动终端互相通信。 二、实验目的 1 、理解无线局域网的工作原理; 2 、熟悉无线局域网的规划与构建过程; 3 、掌握无线局域网的配置方法; 三、实验学时 2 学时 四、实…...

kubeneters-循序渐进Cilium网络(一)
文章目录 概要传统网络不同的网络(或子网)之间通信Kubernetes 中的网络在同一栋大楼内的公寓之间通信跨大楼的通信总结 概要 本文通过“封包追踪”方法,深入解析 Kubernetes 网络通信过程。基于 eBPF 的 Cilium 工具,直观展示了数…...

elasticsearch中IK分词器
1、什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器分词方式StandardAnalyzer单字分词CJKAnalyzer二分法IKAnalyzer词库分词 分词∶即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库…...
Qt之http客户端类
一、HTTP客户端类功能: 1、POST请求发送: 支持发送JSON格式的数据自动处理请求头设置提供上传进度监控、 2、GET请求发送: 简单的GET请求实现支持下载进度监控 3、状态监控: 通过信号槽机制监控上传/下载进度错误处理和状态回调 /…...
18.C语言文件操作详解:指针、打开、读取与写入
目录 1.文件指针2.fopen3.标准流4.fclose5.EOF6.freopen()7.fgetc与getc8. fputc与putc9.fprintf10.fscanf11.fgets12.fputs13.fwrite14.fread15.feof16.fseek17.ftell18.rewind19.fgetpos()与fsetpos20.ferror与clearerr21.remove22.rename 1.文件指针 本篇原文为:…...
深入浅出 OpenResty
1. 引言 1.1. OpenResty简介 OpenResty 是一个基于 Nginx 的高性能 Web 平台,它集成了大量模块,并原生支持 Lua 脚本。这使得开发者能够以非常灵活的方式实现复杂的逻辑,而无需重新编译或扩展 Nginx 核心。OpenResty 的主要特点包括&#x…...

在 .NET 9 中使用 Scalar 替代 Swagger
前言 在.NET 9发布以后ASP.NET Core官方团队发布公告已经将Swashbuckle.AspNetCore(一个为ASP.NET Core API提供Swagger工具的项目)从ASP.NET Core Web API模板中移除,这意味着以后我们创建Web API项目的时候不会再自动生成Swagger API文档了…...

ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技
本文核心 正常跑步动画端枪动画跑起来也端枪 正常跑步动画 端枪动画的上半身 跑起来也端枪 三步走: 第一步制作动画蒙太奇和插槽 第二步动画蓝图选择使用上半身动画还是全身动画,将上半身端枪和下半身走路结合 第三步使用动画蒙太奇 1.开始把&a…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...

未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...
无需布线的革命:电力载波技术赋能楼宇自控系统-亚川科技
无需布线的革命:电力载波技术赋能楼宇自控系统 在楼宇自动化领域,传统控制系统依赖复杂的专用通信线路,不仅施工成本高昂,后期维护和扩展也极为不便。电力载波技术(PLC)的突破性应用,彻底改变了…...