Anduin Xue
Anduin Xue

Anduin's Tech Blog

.NET Core


Why you should never use `Console.WriteLine`

本文探讨了在库代码中使用`Console.WriteLine`的潜在问题及其替代方案。文章指出`Console`类与标准输出的强耦合特性会导致库代码与业务逻辑的依赖混乱——当库被单元测试框架或Web服务器调用时,控制台输出可能完全失效违背依赖倒置原则。通过引入`ILogger`接口抽象层可实现日志系统的解耦,使日志记录与具体输出方式分离。实际应用中可通过`Microsoft.Extensions.Logging`框架构建可扩展的日志体系:通过依赖注入注册日志服务后,开发者可动态切换控制台日志、文件日志或Application Insights等不同输出方式,同时支持日志分级和格式化功能。文章通过代码示例演示了如何通过服务集合配置日志系统,并指出即使不使用依赖注入框架也能通过`LoggerFactory`快速创建控制台日志实例。值得注意的是在终端UI应用或自定义日志实现器等特定场景下,`Console`类仍可作为直接交互工具。那么当你的应用需要同时处理多租户日志时,如何设计日志上下文关联机制?当服务器集群规模扩大时,控制台日志是否仍然能胜任分布式追踪需求?这需要开发者重新思考日志系统的架构设计边界。--Qwen3

C# .NET Core Console App .NET Logging ILogger

Query Kusto database with C# and get result as List<T>.

该实现通过双缓冲机制和任务调度优化Kusto数据写入性能采用双缓冲策略交替使用_activeBuffer和_secondaryBuffer减少内存占用和数据碎片冷却引擎动态计算写入延迟时间平衡写入频率与数据量大小通过ReaderWriterLockSlim和锁机制实现线程安全的数据入队与缓冲区交换操作引擎任务负责批量写入数据并在缓冲区数据量不足时自动休眠冷却引擎负责在休眠后重新唤醒写入任务形成热状态下的持续写入能力支持高并发场景下的非阻塞数据添加通过CalculateSleepTime方法根据缓冲区数据量动态调整休眠时间避免频繁写入和资源浪费SyncAsync方法确保所有待处理数据最终持久化实现可靠的数据同步机制。--Qwen3

C# .NET Core Azure .NET Kusto Azure Data Explorer KQL

Build a common cache service for your C# app.

这篇文章介绍了如何通过封装Microsoft.Extensions.Caching.Memory库创建一个更简洁的缓存抽象层,重点展示了CacheService类通过策略模式实现的条件缓存机制与选择器模式的结合应用。作者通过封装后的RunCache方法简化了复杂对象的缓存操作,允许开发者通过设置缓存过期时间动态控制数据新鲜度,并通过Selector模式实现缓存数据的转换处理。单元测试示例验证了该方案在不同场景下的行为特征:包括基于缓存条件的动态存储策略、对null值的特殊处理、通过选择器转换数据后的缓存逻辑,以及如何通过设置0分钟缓存时间实现强制刷新。这种设计既保持了原始缓存库的灵活性,又通过策略模式将缓存规则与业务逻辑解耦,为复杂缓存场景提供了可扩展的解决方案。测试用例的覆盖范围暗示着该模式在处理多条件组合缓存场景时的鲁棒性,同时引发思考:是否还有其他维度可以扩展这种缓存策略模式?--Qwen3

ASP.NET Core C# .NET Core Performance Caching .NET Cache MemoryCache

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

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

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

C#获取腾讯云直播的推流地址和观看地址

在技术实践中解决跨语言API适配难题时,腾讯云直播服务的C#推流地址生成方案揭示了开发者生态中的常见困境。当Java示例中的txTime参数成为理解障碍时,时间戳的1970纪元计算逻辑最终成为破解接口规则的关键线索。MD5安全校验与字符串拼接看似简单的技术动作,实则包含着对API文档缺失的深刻思考——当标准示例缺席时,开发者如何通过逆向思维构建跨语言解决方案?代码中Domain与PlayDomain的双重配置不仅体现了流媒体服务的分层架构,更暗示了实时音视频传输的复杂性:在RTMP、FLV、HLS协议并存的场景下,如何通过统一接口管理多协议适配?推流安全验证机制的实现方式,是否暗示着更广泛的云服务安全策略设计原则?当代码将时间戳转换为十六进制字符串,这个看似机械的转换过程是否隐含着对时间维度在数字世界中表达方式的哲学思考?推流地址生成背后隐藏的Unix时间戳计算、MD5加密、URL参数拼接等技术链条,是否预示着现代云服务接口设计中时间、安全与可用性三者间的微妙平衡?而最终输出的推流与播放地址,是否正在暗示着实时音视频传输领域更深层的技术演进方向?--Qwen3

C# .NET Core Tencent Cloud Live Streaming China Tencent Cloud Live

Scan all accessible class in C#

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

C# .NET Core Reflection Type Retrieval Assembly Scanning GetReferencedAssemblies

Inject an instance of a class with all default values

这篇博客探讨了如何通过编程自动构建包含默认值的类实例以生成API响应示例。作者提出了一种递归注入机制,通过类型判断和反射技术动态生成对象结构。核心方法Make能够根据类型参数生成基础值(如字符串返回"an example string",整型返回0),并针对集合类型(List和Array)进行特殊处理——对抽象类类型通过查找子类实例填充集合,例如List<Car>会同时包含Truck和BenchCar的实例。对于嵌套对象采用递归注入策略,通过反射获取属性类型后调用GenerateWithConstructor方法,该方法能智能处理带参数的构造函数(如MyClass(string input))并注入所需参数。测试案例显示该方案能正确处理包含枚举、数组、集合、抽象类继承结构的复杂对象,并生成符合预期的JSON示例。然而当对象包含接口类型或泛型约束时,当前方案是否能正确注入?如何处理私有构造函数或带验证逻辑的属性注入?这些未尽的探索或许能启发读者思考更完善的对象生成策略。--Qwen3

C# .NET Core Automation DependencyInjection ObjectCreation PropertiesHandling