Anduin Xue
Anduin Xue

Anduin's Tech Blog

.NET Topics about .NET Core and C#


Programmatically connect to the remote server via SSH and execute remote command.

文章围绕如何通过程序化方式实现SSH远程服务器连接与命令执行展开重点探讨了.NET Core环境下借助SSH.NET库完成自动化运维任务的实践路径。开发者通过创建控制台项目并集成SSH.NET库实现了从连接认证到命令执行的完整流程验证了使用代码替代人工SSH操作的可行性。示例代码展示了如何通过Renci.SshNet命名空间下的SshClient类构建连接执行"apt upgrade"命令并输出执行结果同时处理连接状态与错误信息。这种程序化方案为服务器管理工具开发提供了新思路但也引发关于自动化运维边界与风险的思考——当机器接管了原本需要人工判断的运维操作后如何确保指令执行的准确性如何处理敏感操作的认证安全如何应对网络波动导致的连接中断等问题。文章提供的代码框架虽然实现了基础功能但实际应用中可能需要更复杂的逻辑处理例如异步执行、结果解析、异常重试等机制的补充。SSH.NET作为支持并行操作的开源库其文档中提及的高级特性如端口转发、文件传输等功能是否能与现有代码形成更强大的组合如何构建可扩展的服务器管理架构这些都值得进一步探索。当代码开始远程操控物理服务器时我们是否正在见证运维工作的范式转移?自动化程度的提升是否会让服务器管理变得更加透明还是反而带来新的复杂性?这些问题或许能在文章提供的实践基础上找到启发性的答案。--Qwen3

C# .NET Core bash Linux SSH Renci.SshNet

Use JetBrains code quality analyzer to prevent checking-in bad C# code

本文介绍了如何通过JetBrains ReSharper代码质量分析工具在Azure DevOps和GitHub Actions中自动拦截不符合规范的C#代码提交。文章展示了在持续集成流水线中集成ReSharper的YAML配置方案,包括安装代码质量分析插件、定义检查任务优先级以及通过.editorconfig文件自定义规则集的完整实践路径。特别指出在Azure DevOps中将代码检查任务置于构建之后测试之前可避免无效代码测试浪费资源,并揭示了无需购买ReSharper授权即可通过dotnet工具链实现本地代码质量检测的免费方案。文章引发思考:当自动化代码检查与团队开发习惯产生冲突时,如何平衡代码质量标准与实际开发灵活性?如何通过规则调整既避免过度约束又确保核心代码规范?读者或许会好奇:在云原生开发盛行的当下,如何将静态代码分析与动态测试策略结合形成更全面的质量保障体系?--Qwen3

C# Azure DevOps JetBrains Resharper Code Quality Pipelines

C# run tasks in a threads pool with fixed size

本文提出了一种基于C#的固定线程池任务调度方案通过线程安全队列实现动态任务分配解决了多核CPU资源利用与任务池扩展性之间的平衡问题。方案通过SafeQueue实现并发安全的任务队列管理CannonQueue服务则采用动态调度策略在保持最大并行度的同时支持任务池的动态扩展。当检测到线程空闲时自动触发任务分配机制确保核心资源的持续利用。针对依赖注入场景设计了QueueWithDependency方法通过服务作用域隔离解决了实体框架等依赖的生命周期问题。方案支持三种使用模式:即时启动的队列模式延迟启动的批量处理模式以及无等待的火并忘记模式。实现中通过Task.WhenAny实现非阻塞任务监控并通过日志记录实时展示任务运行状态。该方案引发的思考包括:如何在不同硬件配置下自适应调整并行度?当任务处理时间差异较大时如何优化资源分配?如何设计任务失败的重试机制?以及在高并发场景下如何平衡内存占用与吞吐量?--Qwen3

C# Async Task Multi-Threading async programming task queue

Display code coverage information for .NET Core project using Azure DevOps.

本文深入解析了如何在Azure DevOps中为.NET Core项目展示代码覆盖率数据,通过构建管道配置和测试结果分析,揭示了软件质量保障的关键路径。文章不仅提供了从构建管道创建到覆盖率徽章生成的完整操作链,更引发了对测试覆盖度与代码质量关系的深层思考——当测试覆盖率显示为87%时我们是否应该满足?如何通过覆盖率数据识别潜在的测试盲区?在跨平台开发场景中Linux系统仍不支持代码覆盖率收集这一现状是否会影响开发策略?文章通过Windows平台专有的构建配置要求,提示开发者在选择CI/CD环境时需权衡工具链兼容性与测试完整性。当覆盖率徽章以动态形式展示在readme文件中时这种可视化手段如何影响团队对代码质量的感知?更重要的是当测试通过率与覆盖率指标出现偏差时我们该如何解读这两组数据背后的技术含义?最终文章抛出一个值得所有开发者思考的问题:在追求100%覆盖率的过程中我们是否忽略了测试用例设计本身的质量?这种对测试方法论的反思或许比单纯追求数字更为重要。--Qwen3

.NET Core Azure DevOps .NET Test MSTest Integration Test Code coverage GitHub

ASP.NET Core Integration Test using MSTest

本文探讨了在ASP.NET Core集成测试中替代官方推荐xunit框架的可能性问题。通过实践验证表明MSTest可以完美替代xunit实现完整测试流程文章展示了如何通过移除xunit依赖并安装MSTest组件构建基于MSTest的测试架构重点解析了测试服务器的启动机制与HTTP请求的自动化验证方案。测试类通过动态创建服务器实例并绑定指定端口实现了与真实环境的模拟交互同时通过[TestMethod]和[DataRow]特性构建了可扩展的测试用例体系。值得注意的是测试框架的切换并非简单的工具替换而是需要重构测试生命周期管理尤其在服务器启动与资源释放环节必须建立严格的[TestInitialize]和[TestCleanup]机制以确保测试环境的隔离性。这种测试架构的迁移启示我们软件测试的灵活性不仅体现在框架选择上更在于对测试流程的深度控制。当面对不同测试框架的适配问题时我们是否应该优先考虑开发习惯还是框架特性?在测试稳定性与框架扩展性之间是否存在最优解?这些问题或许能引发开发者对测试策略更深层的思考。--Qwen3

ASP.NET Core C# .NET Core Test MSTest Functional Test Integration Test

Fire and forget in ASP.NET Core with dependency alive

在ASP.NET Core中实现fire and forget模式时,开发者常通过Task.Run启动异步任务但可能忽略依赖项生命周期管理。当控制器触发耗时任务后自身即被释放,导致注入的依赖可能提前销毁从而中断任务执行。文章揭示了直接在控制器中调用Task.Run的潜在风险,提出通过单例服务CannonService解决依赖存活问题的创新方案。该服务利用IServiceScopeFactory动态创建作用域,确保任务执行期间依赖项始终有效。通过将耗时操作迁移至单例服务中执行,既避免阻塞主线程又能保持依赖存活,同时引入异常处理机制增强任务健壮性。这种设计模式突破了传统依赖注入的生命周期限制,为长时异步任务提供了优雅的解决方案。文章最后抛出值得深思的问题:当任务依赖多个作用域服务时,如何平衡资源占用与任务可靠性?当系统负载剧增时,这种基于Task.Run的调度策略是否存在潜在瓶颈?或许我们该重新审视fire and forget在现代云原生架构中的最佳实践。--Qwen3

ASP.NET Core C# Async Fire and forget dependency injection singleton service

How to serialize JSON object in C# without Newtonsoft Json

在C#开发中遇到JSON序列化需求却受限于Newtonsoft.Json的版本冲突问题时如何破局?本文提出了一种纯C#解决方案通过DataContractJsonSerializer实现自定义JSON转换器。开发者只需将MyJsonConverter类集成到项目中即可获得与Newtonsoft.Json相似的序列化能力该方法通过MemoryStream实现内存级数据流转无需依赖第三方库即可完成复杂对象的递归序列化。示例中的书籍关联结构验证了其处理嵌套对象的能力当对象的Related字段包含子对象时转换器能自动处理null值并保持结构完整性。这种轻量级方案不仅解决了依赖冲突问题还为资源受限场景提供了替代方案但同时也引发更多思考:当面对包含循环引用的对象时这种转换机制会如何表现?在性能对比中纯C#方案与Newtonsoft.Json的效率差异有多大?当需要处理包含动态类型的复杂数据结构时是否需要对转换器进行扩展?这些问题的答案或许能帮助开发者在不同场景下做出更明智的技术选型。--Qwen3

C# JSON .NET Newtonsoft.Json JSON handling Custom JSON solution

Creating a proxy to another URL with ASP.NET Core

本文介绍了一种在ASP.NET Core中实现HTTP代理的轻量级方案通过扩展方法将HttpContext转换为可重用的HttpRequestMessage并构建完整的请求转发与响应处理链。文章重点展示了两个核心方法CreateProxyHttpRequest与CopyProxyHttpResponse的实现逻辑:前者通过解析原始请求方法处理流式数据并复制请求头信息构建目标请求对象后者则通过处理响应状态码头信息及响应体实现透明返回。这种设计允许开发者在现有项目中灵活实现请求代理功能而无需部署独立的代理服务器。值得注意的是实现过程中针对不同HTTP方法的处理差异以及头信息的精细拷贝策略都体现了对HTTP协议的深入理解。当访问特定路由时请求将被代理至目标URL(如示例中的google.com)并保持浏览器端的无感知交互。这种技术方案为API调试中间件开发等场景提供了新的可能性但同时也引发思考:如何在实际项目中平衡代理功能的灵活性与安全性?如何处理更复杂的路由规则与身份验证需求?当请求链延长时如何优化性能瓶颈?这些问题都值得开发者结合具体场景深入探索与实践。--Qwen3

ASP.NET Core C# Reverse Proxy Web Proxy HTTP Proxy

Get unique random numbers in C#

本文提出了一种基于RSA算法的非重复随机数生成方案,解决了传统方法在性能与内存占用上的瓶颈。传统线性同余法通过逐个生成并比对数据库实现去重,其O(n²)的时间复杂度在数据量增大时导致性能急剧下降;而序列打乱法虽可实现O(n)时间复杂度但需要O(n)的内存空间。作者创新性地将密码学中的模幂运算与素数特性结合,通过构造一一映射函数C = A^D mod N实现O(n)时间复杂度和O(1)空间复杂度的随机数生成。该方法巧妙利用素数分解特性,当N为两个不同素数乘积时,通过计算D和E的模反元素建立双向映射关系,确保生成的随机数既无重复又无遗漏。代码实现中通过素数检测、参数验证和自然数遍历等模块构建完整解决方案,最终测试结果验证了随机数的唯一性和分布的均匀性。该方法在处理百万级数据时展现出显著优势,但其有效性依赖于N的可分解性,这引发了对算法适用范围与安全性的思考:当N无法分解为两个素数时是否仍有替代方案?如何在资源受限场景中平衡性能与安全性?或许我们还能思考,密码学技术在算法优化中还有哪些未被开发的潜力?--Qwen3

C# .NET Core Algorithm Random Numbers Unique random Non-repeat Random

HTTP post file from .NET Core new HTTP client

这篇文章介绍了.NET Core 3中全新HTTP客户端处理文件上传的实践方法。当开发者需要通过HTTP POST请求提交二进制文件时,会发现与常规表单数据存在本质差异——multipart/form-data格式的边界划分特性要求特殊的处理方式。作者通过对比传统表单编码与文件上传的差异,揭示了MultipartFormDataContent组件的核心价值:它能够自动生成符合RFC 7578规范的多段内容结构,同时智能处理边界字符串生成和内容分段编码。通过StreamContent包装文件流并添加到formData集合中,开发者可以轻松构建包含文件和其他表单字段的混合请求体。这种设计不仅简化了文件上传的实现复杂度,更展现了.NET Core对HTTP语义的深度封装能力。当思考现代Web服务中文件传输的演进方向时,我们不禁要问:在Server-Sent Events和WebSockets盛行的今天,这种基于HTTP的流式上传方式是否仍然具备不可替代的优势?当面对PB级大文件传输需求时,这些封装好的API能否支撑更底层的自定义协议扩展?或许答案就藏在对HTTP语义的重新解构中。--Qwen3

ASP.NET Core C# .NET Core HTTP Web File HTTP Client POST

How to write a bot for Kahla

这篇博客详细介绍了如何通过Kahla.SDK快速构建一个功能强大的Kahla聊天机器人。文章从基础步骤入手,展示了如何在.NET Core环境中创建控制台应用并集成Kahla.SDK依赖,通过重写`OnMessage`方法实现消息的接收与响应,最终构建出一个能自动回复消息的回声机器人。开发者只需遵循五步流程即可完成基础功能开发,而高级配置部分则进一步扩展了依赖注入和自定义服务的可能性,允许通过`StartUp`类实现更复杂的全局配置。文章不仅提供了完整的代码示例,还通过运行截图直观展示了机器人的实际交互效果。值得关注的是,作者巧妙地将技术实现与应用场景结合,让读者思考:当机器人能够处理消息后,如何通过自然语言处理或机器学习赋予其更智能的对话能力?如何设计个性化交互逻辑以满足不同场景需求?当依赖注入机制被充分利用时,又能在服务层实现哪些创新功能?这些问题为读者打开了想象空间,而文章中提到的`bot.kahla.app`演示和GitHub示例仓库则为实践探索提供了起点。--Qwen3

C# .NET Core Aiursoft Kahla Bot Kahla.SDK Kahla App Console App

Scan all accessible class in C#

在C#中获取所有可访问程序集看似简单但实际涉及递归扫描的深层逻辑。通过GetReferencedAssemblies方法可以遍历引用树但如何确保递归扫描的完整性成为关键挑战。文章展示的ScanAssemblies函数通过递归加载每个程序集的引用构建完整的依赖图谱而AllAccessiableClass方法则将散落的程序集拼接成完整的类型全景图。这种扫描方式揭示了程序集之间隐含的拓扑结构但同时也带来新的思考:当程序集在运行时动态加载时如何构建动态的引用树?当依赖链包含循环引用时递归算法是否会产生性能瓶颈?更进一步如何区分"可访问"与"可实例化"类的边界?扫描到的类型是否隐含着未被发现的代码依赖风险?这些问题提示我们程序集扫描不仅是技术实现更是对系统架构的深层洞察。当你的代码开始质疑扫描结果的准确性时是否意味着程序集加载机制本身存在更复杂的语义?--Qwen3

C# .NET Core Reflection Type Retrieval Assembly Scanning GetReferencedAssemblies