Anduin Xue
Anduin Xue

Anduin's Tech Blog

.NET Topics about .NET Core and C#


Inject an instance of a class with all default values

本篇博客详细介绍了如何使用C#编写一个通用的实例生成器,能够为给定类型生成一个实例,并为其属性设置默认值。通过递归地调用Make方法,我们可以处理嵌套的属性,从而生成完整的实例。文章中还提到了如何处理列表、数组和枚举等不同类型的属性,以及如何处理抽象类和接口。 在最后,作者通过一个实际的测试用例展示了生成器的使用方法以及生成的结果。这个生成器在很多场景下都非常实用,比如为单元测试准备数据、为前端提供模拟数据等。在实际应用中,我们还可以根据需要对生成器进行扩展,以支持更多类型的属性和更复杂的对象结构。 那么,您是否有想过如何为您的项目中的类生成实例,而不用手动为每个属性赋值?本文提供的方法是否能帮助您解决这个问题?在实际应用中,您还需要对生成器进行哪些优化和改进?希望本文能为您提供一些启发和灵感。--GPT 4

C# .NET Core

Limit ASP.NET Core request frequency by IP address

在默认情况下,用户可以无限制地请求ASP.NET Core Web服务器。用户可能会频繁地请求我们的Web服务器并提交大量垃圾数据。此外,过于频繁的请求可能是一种可怕的攻击,可能导致我们的服务中断和大量的金钱损失。 那么我们如何根据IP地址对请求进行分组,限制用户请求的频率,并返回错误信息呢? 已经有一个很好的限制请求速率的库,叫做AspNetCoreRateLimit。 GitHub: [https://github.com/stefanprodan/AspNetCoreRateLimit](https://github.com/stefanprodan/AspNetCoreRateLimit) 但是,这个库太重了,无法通过控制器和操作进行过滤。我必须写一个更简单的库。 首先,编写一个属性: public class LimitPerMin : ActionFilterAttribute {...} 这个属性将在字典中保存所有IP请求频率。如果一个IP匹配我们的限制,就返回`(int)HttpStatusCode.TooManyRequests`。 要使用此属性,只需将其添加到您的控制器或操作中,如下所示: namespace Aiursoft.Account.Controllers { [LimitPerMin] public class AccountController : Controller { } } 当用户尝试在我们的限制范围内请求我们的服务器时,服务器将成功响应以下头信息: 1. x-rate-limit-limit: 1m 2. x-rate-limit-remaining: 30 默认限制是每分钟30个请求。用户在一分钟内无法发送更多请求,否则将被拒绝。 如果您想覆盖默认限制,请像这样使用它: [LimitPerMin(20)] 本文介绍了如何使用ASP.NET Core实现IP地址限制请求频率的方法,通过编写一个简单的属性,可以有效地限制用户请求的频率并返回错误信息。文章还介绍了如何将此属性应用于控制器或操作,以及如何覆盖默认限制。那么,如何根据实际需求进一步优化限制策略呢?在实际应用中,如何确保这...--GPT 4

ASP.NET Core .NET Core IP HTTP

How to run async method in C# synchronous method

在某些情况下,我们可能需要运行一个异步方法并获取其结果,但无法使用`await`关键字,例如在构造函数方法、实现接口同步方法或实现抽象类同步方法中。本文提供了一种解决方案,将异步方法解包并在同步方法中调用。 首先,将以下代码放在任意位置: ```csharp using System.Threading; using System.Threading.Tasks; public static class AsyncHelper { private static readonly TaskFactory _taskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default); public static TResult RunSync<TResult>(Func<Task<TResult>> func) => _taskFactory .StartNew(func) .Unwrap() .GetAwaiter() .GetResult(); public static void RunSync(Func<Task> func) => _taskFactory .StartNew(func) .Unwrap() .GetAwaiter() .GetResult(); } ``` 然后创建一个异步方法,如下所示: ```csharp private static async Task<int> MyAsyncMethod() { // do something async. await Task.Delay(1000); Console.WriteLine("R...--GPT 4

C# .NET Core Async

Consolidate all Entity-Framework database migrations to one migration

本文介绍了如何在不删除任何数据的情况下,整合所有Entity Framework Core代码优先迁移。在代码出错或迁移过多导致编辑器变慢的情况下,可能需要重置所有迁移。但是,直接在代码中删除所有迁移会导致数据库更新失败。因此,本文提供了一个解决方案,分为以下几个步骤: 1. 删除`Migrations`文件夹下的所有`*.cs`文件。 2. 删除数据库中`_EFMIgrationHistory`表中的所有项。 3. 创建一个新的迁移,如:`dotnet ef migrations add Init`。 4. 注释由上一步生成的`20XXXXX_Init.cs`类中的`Up`方法和`Down`方法中的所有内容。 5. 使用当前应用程序的状态更新数据库。此步骤不会更改数据库,而只会在`_EFMigrationHistory`表中创建一个项。这将在数据库中记录一个历史,即`Init`迁移已应用于数据库。 6. 取消注释C#文件中的`Up`和`Down`方法。 7. 如果有版本控制,请检查。 8. 重新运行`dotnet ef database update`。这可能会显示一切都是最新的,这正是我们所期望的。 9. 启动应用程序,应用程序将正常运行。 如果您有其他使用不同数据库的环境,则需要**针对每个数据库**执行以下步骤: 10. 检出步骤7中推送的最新代码。 11. 删除数据库中`_EFMIgrationHistory`表中的所有项。 12. 注释由步骤3生成的`20XXXXX_Init.cs`类中的`Up`方法和`Down`方法中的所有内容。 13. 使用当前应用程序的状态更新数据库。此步骤不会更改数据库,而只会在`_EFMigrationHistory`表中创建一个项。这将在数据库中记录一个历史,即`Init`迁移已应用于数据库。 14. 将代码状态重置为步骤10。例如:`git reset --hard HEAD`。 15. 尝试运行应用程序。 在开始之前,强烈建议您首先备份数据。本文提供的方法仅适用于代码优先的EF Core,并不能确保数据不会丢失。那么,这种方法是否适用于所有场景?是否存在更好的方法来整合迁移?在实践中,您可能需要自己寻找答案。--GPT 4

ASP.NET Core C# .NET Core Entity Framework SQL Server

Upgrade existing class library to .NET Core 3.0

本篇博客讨论了如何将现有的类库升级到最新的.NET Core 3.0。在升级过程中,可能会遇到一些警告和错误。文章详细介绍了如何解决这些问题,以便顺利完成升级。 首先,根据项目类型选择正确的项目文件第一行。对于Web项目,请使用`<Project Sdk="Microsoft.NET.Sdk.Web">`;对于Razor库,请使用`<Project Sdk="Microsoft.NET.Sdk.Razor">`。在这两种情况下,都不需要再次包含`Microsoft.AspNetCore.App`框架。 其次,对于非Razor库和非Web项目,通常不需要`Microsoft.AspNetCore.App`。但是,如果确实需要它,请考虑添加相应的框架引用。 最后,可能会遇到关于C#版本的错误。这个问题可能是因为没有使用最新的Visual Studio。为了解决这个问题,可以在项目文件中添加`<LangVersion>latest</LangVersion>`,然后清理并重新构建项目。 本文提供了一系列解决方案,帮助读者顺利升级现有类库到.NET Core 3.0。在升级过程中,是否还有其他潜在问题需要注意?如何确保项目在升级后仍能正常运行?阅读全文以获取更多详细信息和解决方案。--GPT 4

C# class library .NET Core