Anduin Xue
Anduin Xue

Anduin's Tech Blog

C#


Restore a deleted branch from Azure DevOps using it's SDK

本篇博客详细介绍了如何使用Azure DevOps SDK来恢复一个已删除的分支。首先,需要确保Git客户端已配置。接下来,在项目中安装Azure DevOps SDK。博客提供了用于恢复已删除分支的代码示例,其中包括了创建GitPushSearchCriteria对象、获取推送信息、创建GitRefUpdate对象以及调用UpdateRefsAsync方法来恢复分支。 在成功执行恢复分支的代码后,可以在本地运行`git fetch`命令,恢复的分支将会出现在本地仓库中。本文提供了一种简便的方法来恢复已删除的分支,这对于在意外删除分支后进行恢复非常有帮助。然而,在实际操作中是否能够顺利恢复取决于多种因素,例如分支的复杂性、项目的大小等。那么,除了使用Azure DevOps SDK,还有其他方法来恢复已删除的分支吗?如何确保在恢复分支的过程中不会引入潜在的问题?对于这些问题,希望读者能够在阅读本文的过程中思考并找到答案。--GPT 4

C# git Azure Azure DevOps SDK

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

在这篇博客中,我们将学习如何使用.NET Core和SSH.NET库编程地连接到远程服务器并执行命令。这对于构建服务器管理工具非常有用,尤其是当需要远程连接到Ubuntu服务器时。 首先,创建一个新的.NET Core项目,然后安装最新的SSH.NET库。接下来,编写一段使用SSH.NET库连接到远程服务器并执行命令的代码。示例中的代码将连接到远程服务器并运行`apt upgrade`命令。运行应用程序后,将自动连接到远程服务器并执行该命令。 SSH.NET库还有许多其他用途,可以查看其文档以了解更多信息。通过本文的示例,你将能够更好地理解如何使用.NET Core和SSH.NET库远程连接和管理服务器。在实际应用中,你可能需要根据自己的需求调整代码以满足不同的场景。 那么,你是否有兴趣尝试使用SSH.NET库来简化远程服务器管理呢?或者你是否有其他方法来实现类似的功能?让我们一起探讨吧!--GPT 4

C# .NET Core bash Linux SSH

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

在本博客中,我们将探讨如何使用Azure DevOps和JetBrains代码质量分析器自动检查C#代码质量并拒绝包含不良代码的Pull Requests。首先,我们需要安装JetBrains代码质量检查器,然后将其添加到构建管道中。在构建任务后和测试任务前插入此任务,以确保在没有构建项目的情况下不会引发问题。并选择合适的严重性级别,以便在检测到无效代码时使管道失败。 对于GitHub Actions,我们也可以轻松地将其应用到GitHub Actions中,只需参考给出的yaml代码即可。此外,我们还需要在本地检查代码质量并生成报告。虽然购买ReSharper是最好的方法,但我们还是可以免费使用代码质量检查工具。通过运行给出的命令,可以在本地安装语法检查工具并运行检查。 为了调整检查级别或抑制警告,我们可以创建一个.editorconfig文件并添加相应的规则。通过参考给出的链接,我们可以查询.editorconfig的所有级别属性。如此一来,我们就拥有了一个完整的C#代码质量自动检查解决方案,而且是免费的!祝您编码愉快!在这个过程中,你有没有想过如何根据项目需求调整代码质量检查标准?或者如何在本地生成详细的代码质量报告以进行调试和优化?--GPT 4

C# Azure DevOps JetBrains Resharper Code Quality Pipelines

C# run tasks in a threads pool with fixed size

在本文中,我们将探讨如何在C#中使用固定大小的线程池运行任务。首先,我们提供了一个`CannonQueue`类,该类使用`SafeQueue`来存储待处理的任务,并使用`RunTasksInQueue`方法来并行执行这些任务。为了能够动态地向任务池中添加任务,我们修改了`QueueNew`方法,使其在添加任务时重新启动引擎。同时,我们还提供了一个`QueueWithDependency`方法,以便在需要访问诸如数据库或HTTP之类的依赖项时保持依赖项处于活动状态。 最后,我们展示了如何注册`CannonQueue`作为单例依赖项,并如何在实际应用中使用该服务。例如,我们可以使用`QueueNew`方法将下载任务添加到队列中,并利用`RunTasksInQueue`方法并行执行这些任务。此外,我们还可以使用`QueueWithDependency`方法来处理具有依赖关系的任务,例如使用Entity Framework的任务。 那么,如何在实际应用场景中高效地利用这个线程池呢?本文提供的方法是否足够满足您的需求,还是需要进一步优化?在实际开发过程中,可能会遇到哪些挑战和问题?希望这篇文章能够启发您的思考,帮助您找到解决方案。--GPT 4

C# Async Task Multi-Threading

ASP.NET Core Integration Test using MSTest

在官方文档中,仅有一个使用xunit进行ASP.NET Core集成测试的示例。但如果你不喜欢xunit呢?我们能否用MSTest替换它?答案是可以的。 首先,卸载xunit并安装MSTest。清理项目结构,然后为测试项目安装MSTest。接下来,在测试项目中启动服务器。在测试项目下创建一个名为`BasicTests.cs`的新类。将以下代码放入基本测试中,当测试开始时,它将自动启动一个新的ASP.NET Core Web服务器,并使用来自主Web项目的Startup。 接下来,添加一个简单的测试。在测试类中插入一个新功能。在这个新测试中,你将请求测试服务器并检查结果。现在你可以运行测试了!在Visual Studio中,或者在解决方案文件夹下执行`dotnet test`。 最后,考虑测试清理。在测试之后,你应该停止服务器以防止影响其他测试。只需停止并释放服务器即可完成工作。 本文讨论了如何使用MSTest替换xunit进行ASP.NET Core集成测试,并提供了详细的步骤。那么,使用MSTest进行集成测试是否能带来更好的测试效果?在实际应用中,MSTest和xunit之间的性能差异如何?这些问题留给读者自己探索和找到答案。--GPT 4

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

Fire and forget in ASP.NET Core with dependency alive

在C#中,实现fire and forget非常简单,只需使用Task.Run(() => FireAway())。然而,在ASP.NET Core控制器中,这种方法可能并不合适。当我们在控制器中触发一个耗时的任务,任务将作为fire-and-forget成功启动。但在处理HTTP响应后,控制器可能会被释放,这意味着依赖项可能不再存在,因此任务可能无法完成。 为了在触发任务时始终保持依赖项处于活动状态,我们需要创建一个新的服务来包含它,这个新服务必须是单例的,因为单例服务永远不会被释放。我们需要在服务中获取依赖项,而不是在控制器中,因为控制器的生命周期依赖于HTTP上下文,而单例服务则不依赖。 创建一个新类CannonService,并在StartUp.cs的ConfigureServices方法中将其注册为单例。在控制器中使用时,只需将CannonService注入到控制器中,然后调用一个依赖于某些耗时操作的函数。这个方法不会阻塞当前线程,可以直接向客户端返回结果,而发送器在发送邮件时始终保持活动状态。 作者已将上述代码发布为一个Nuget包。你可以在这里查看源代码:[Aiursoft.Canon](https://gitlab.aiursoft.cn/aiursoft/canon/-/tree/master),也可以在这里下载包:[Nuget.org](https://www.nuget.org/packages/Aiursoft.Canon/)。 这篇博客分享了在ASP.NET Core中实现fire and forget的方法,以及如何确保依赖项在任务执行过程中保持活动状态。那么,你是否考虑过在自己的项目中使用这种方法来优化性能呢?--GPT 4

ASP.NET Core C# Async Fire and forget

How to serialize JSON object in C# without Newtonsoft Json

本篇博客介绍了如何在C#中不使用Newtonsoft.Json库进行JSON对象的序列化和反序列化。在某些情况下,我们可能无法访问`Newtonsoft.Json`包,例如当不同的包使用不同版本的库时,可能会导致构建过程中的版本冲突。这通常发生在一些非常大的项目中。 本文提供了一个名为`MyJsonConverter`的静态类,其中包含两个方法:`Serialize`用于将对象序列化为JSON字符串,`Deserialize`用于将JSON字符串反序列化为对象。这个类使用了`System.Runtime.Serialization.Json`命名空间中的`DataContractJsonSerializer`类来实现序列化和反序列化。 通过这个类,我们可以像使用`Newtonsoft.Json`一样简单地进行JSON操作。示例代码创建了一个名为`Book`的简单类,并使用`MyJsonConverter`将其序列化为JSON字符串,然后将该字符串反序列化为`Book`对象。运行结果显示序列化和反序列化均成功。 这篇博客提供了一个在不依赖`Newtonsoft.Json`的情况下进行JSON操作的替代方案。那么,在实际项目中,我们是否应该放弃使用`Newtonsoft.Json`呢?这个问题值得我们深入思考。--GPT 4

C# JSON .NET Newtonsoft.Json

C# Rotate the square matrix

In this blog post, a C# solution is presented for rotating a square matrix, a problem that the author encountered during an interview. The provided code demonstrates a straightforward approach to this problem by defining two methods: Rotate and RotateItem. The Rotate method is responsible for iterating through the matrix and calling the RotateItem method for each element, while also handling the padding to ensure that the inner matrix is rotated correctly. The RotateItem method, on the other hand, takes care of swapping the elements in the matrix to achieve the desired rotation. By sharing this solution, the author aims to help fellow developers who may face a similar problem in the future. The code is easy to understand and can be used as a reference or starting point for further exploration of matrix manipulation techniques in C#. Readers are encouraged to study the provided code, try it out, and think about possible optimizations or alternative approaches to this problem. How would...--GPT 4

C# Algorithm Matrix Math

EF second layer cache to enhance your SQL database performance based on Redis

本篇博客介绍了如何使用基于Redis的EF第二层缓存来提高SQL数据库性能。首先,安装`EFCoreSecondLevelCacheInterceptor`包,然后在`StartUp`类的`ConfigureServices`方法中进行相应的配置。这个缓存会在通过使用这个库的DbContext更改实体(插入、更新或删除)时更新。如果数据库通过其他方式(如存储过程或触发器)更新,缓存将变得过时。但是,如果我们的应用程序在多个实例中运行,数据库的更改可能不适用于其他实例,可能会导致许多问题。此时,我们需要使用Redis来存储缓存。 Redis是一种开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。本文介绍了三种安装Redis的方法,分别是在Redis官网下载安装、在Windows Server上安装及在Azure上创建Redis缓存实例。安装完成后,使用命令安装`EasyCaching.Redis`包,并修改`StartUp`方法以连接Redis数据库并使用Redis存储Entity-Framework Core的缓存,支持扩展。 此外,还需在`appsettings.json`文件中添加正确的Redis连接信息。这样,在启动过程中,应用程序将尝试连接到Redis数据库,并使用Redis缓存数据库结果。在不修改代码的情况下,ASP.NET Core应用程序的性能得到了极大的提升。Redis值得称赞! 那么,如何在多实例应用程序中保持可扩展性呢?使用Redis作为缓存存储是否足够满足我们的需求?在实际应用中,我们可能还需要关注其他性能优化策略。--GPT 4

ASP.NET Core C# SQL Server SQL Entity Framework Core Azure Redis Caching Cache

Get unique random numbers in C#

本篇博客介绍了如何在C#中生成唯一的随机数。作者首先构建了一个简单的素数检测方法,并通过该方法生成一个素数序列。接着,编写了一个检测E值是否正确的方法,以及从自然数中找到有效E值的方法。在此基础上,作者实现了将输入值N分解为两个素数P和Q的方法,并通过P和Q得到有效的D和E值。 为了检验所得到的P、Q、D和E值是否有效,作者编写了一个函数,该函数在获取正确的P、Q、D和E值时返回true,失败时返回false。最后,通过调用I ^ d % N来生成随机数序列。由于输入的N值可能无效,因此还需要跳过所有无效输入并找到其附近的最近N值。 博客中提供了一个完整的示例,展示了如何使用这些方法生成唯一的随机数。通过运行示例,我们可以看到输出的随机数序列既随机又唯一。这种方法在需要生成不重复随机数的场景中非常有用。 那么,这种生成随机数的方法是否有局限性?在实际应用中,我们可能需要考虑性能和效率问题。此外,是否有其他更简洁或者更通用的方法来生成唯一随机数呢?在阅读本文后,希望读者能够对这些问题进行思考并尝试寻找答案。--GPT 4

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

HTTP post file from .NET Core new HTTP client

随着.NET Core 3的发布,微软推出了一款全新的.NET Core HTTP客户端。新客户端使得调用WEB API变得更加简单。本文将介绍如何使用新客户端提交文件至服务器。 通常情况下,我们调用Web API时不需要提交二进制文件。但是在新客户端中,我们应该如何向服务器提交文件呢?首先,我们需要了解HTTP POST请求带文件与表单URL编码内容的不同之处。表单通过一些边界进行划分,边界名称在HTTP头部的内容类型中指定。 要从.NET Core HTTP客户端提交文件,可以使用`MultipartFormDataContent`,这样框架就可以处理多部分内容。然后,通过添加新的流内容将文件添加到表单中。此外,您还可以向表单中添加其他内容,如URL编码的内容。最后,提交表单。 本文提供的示例代码展示了如何使用新的HTTP客户端提交文件至服务器。在这个过程中,您可能会遇到一些有趣的问题,例如如何处理多个文件的上传,或者如何在提交文件的同时提交其他类型的数据。文章内容将引导您探索这些问题,并帮助您找到合适的解决方案。--GPT 4

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

How to write a bot for Kahla

本篇博客讲述了如何使用Kahla.SDK编写一个Kahla机器人。首先,确保已安装.NET Core SDK。接下来,创建一个新的控制台.NET Core应用,然后为Kahla.SDK添加依赖项。接着创建一个新的C#类,继承`BotBase`类并重写默认的`OnMessage`方法。修改`Program.cs`以启动机器人,然后执行命令以启动机器人。在启动机器人后,使用另一个帐户与之交谈即可。 除此之外,博客还提供了关于依赖注入和高级启动的额外信息。Kahla.Bot支持自定义启动配置,修改`Program.cs`以使用高级启动,并创建一个名为`StartUp`的新类。通过这个类,可以添加自己的服务和配置全局设置。 这篇博客为你提供了一个简单易懂的教程,帮助你编写自己的Kahla机器人。现在,你是否已经跃跃欲试,想要创建一个自己的机器人?你会如何利用这些知识去创造一个有趣且实用的机器人呢?--GPT 4

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