
C#
文章平均质量分 87
平 凡 程 序 猿
分享开发经验和干货,是起点也是终点。
展开
-
如何将IHttpHandler和IHttpModule迁移到ASP.NET Core中间件
ASP.NET Core是一个跨平台、开源的框架,用于在Windows、Mac和Linux操作系统(OS)上开发web应用程序。你可以使用以下任何IDE开发ASP.NET Core 应用程序:Visual Studio Visual Studio for Mac Visual Studio Code在这篇博文中,我们将学习如何如何将asp.net IHttpHandler和IHttpModule迁移到ASP.NET Core中间件并提供代码示例。让我们开始吧!ASP.NET IHttpHa原创 2021-02-26 09:01:33 · 692 阅读 · 0 评论 -
在.NET中使用Apache Kafka(一)
曾经在你的应用程序中使用过异步处理吗?在处理不需要立即执行的任务时,异步代码似乎是不可避免的。Apache Kafka是最常用和最健壮的开源事件流平台之一。许多公司和开发者利用它的强大功能来创建高性能的异步操作,用于微服务的数据集成,以及用于应用程序健康指标的监控工具。这篇文章解释了在.NET应用程序中使用Kafka的细节,还展示了如何在Windows操作系统上安装及使用。它是如何工作的当今世界,数据正在以指数形式增长。为了容纳不断增长的数据,Kafka这样的工具应运而生,提供了健壮而令人印象深刻原创 2021-02-22 08:52:06 · 893 阅读 · 0 评论 -
聊聊ASP.NET Core中的配置
作为软件开发人员,我们当然喜欢一些可配置选项,尤其是当它允许我们改变应用程序的行为而无需修改或编译我们的应用程序时。无论你是使用新的还是旧的.NET时,可能希望利用json文件的配置。在这篇文章中,我们将探讨读取配置所需的必要步骤以及使用这些值。.NET的配置历史对于那些ASP.NET老兵,你可能还记得wen.config。虽然它没有完全被抛弃,但它在ASP.NET Core中扮演着不那么重要的角色。web.config是一个基于XML的文件,用于配置IIS的主机环境。在这个文件中,我们可以放置应原创 2021-02-20 09:14:48 · 214 阅读 · 0 评论 -
如何在ASP.NET Core中编写高效的控制器
通过遵循最佳实践,可以编写更好的控制器。所谓的“瘦”控制器(指代码更少、职责更少的控制器)更容易阅读和维护。而且,一旦你的控制器很瘦,可能就不需要对它们进行太多测试了。相反,你可以专注于测试业务逻辑和数据访问代码。瘦控制器的另一个优点是,它更容易维护控制器的多个版本。这篇文章讨论了使控制器变胖的坏习惯,然后探索了使控制器变瘦和易于管理的方法。我列出编写控制器的最佳实践可能并不全面,但我已经讨论了最重要的一些,并在适当的情况下提供了相关的源代码。在接下来的几节中,我们将研究什么是胖控制器,为什么它是一种原创 2021-02-19 08:58:23 · 205 阅读 · 0 评论 -
如何在ASP.NET Core 中使用IHttpClientFactory
利用IHttpClientFactory可以无缝创建HttpClient实例,避免手动管理它们的生命周期。当使用ASP.Net Core开发应用程序时,可能经常需要通过HttpClient调用WebAPI的方法以检查终结点是否正常工作。要实现这一点,通常需要实例化HttpClient并使用该实例来调用你的方法。但是直接使用HttpClient也有一些缺点,主要与手动管理实例的生命周期有关。你可以使用IHttpClientFactory创建HttpClient来避免这些问题。IHttpClientFa翻译 2021-02-18 09:03:47 · 868 阅读 · 0 评论 -
使用JWT创建安全的ASP.NET Core Web API
在本文中,你将学习如何在ASP.NET Core Web API中使用JWT身份验证。我将在编写代码时逐步简化。我们将构建两个终结点,一个用于客户登录,另一个用于获取客户订单。这些api将连接到在本地机器上运行的SQL Server Express数据库。JWT是什么?JWT或JSON Web Token基本上是格式化令牌的一种方式,令牌表示一种经过编码的数据结构,该数据结构具有紧凑、url安全、安全且自包含特点。JWT身份验证是api和客户端之间进行通信的一种标准方式,因此双方可以确保发送/接翻译 2021-01-30 10:58:58 · 472 阅读 · 0 评论 -
如何创建一个验证请求的API框架
开发一款成功软件的关键是良好的架构设计。优秀的设计不仅允许开发人员轻松地编写新功能,而且还能丝滑的适应各种变化。好的设计应该关注应用程序的核心,即领域。不幸的是,这很容易将领域与不属于这一层的职责混淆。每增加一个功能,就会使理解核心领域变得更加困难。同样糟糕的是,将来就更难重构了。因此,保护领域层不受应用程序逻辑影响是很重要的。其中一个优化是对传入请求的验证。为了防止验证逻辑渗透到领域级别,我们希望在请求到达领域级别之前验证请求。在这篇文章中,我们将学习如何从领域层中提取验证。在我们开始之翻译 2021-01-28 08:48:49 · 2239 阅读 · 0 评论 -
使用.net中的API网关模式封装微服务
在本文中,我们将了解如何使用API网关模式来封装微服务并抽象出底层实现细节,从而允许使用者拥有进入我们系统的一致入口点。为了构建和测试我们的应用程序,我们需要:1.Visual Studio 20192..NET Core 5 SDK由于微服务是一个相当复杂的主题,在我们进入下一节的代码之前,让我们花点时间解释一下基础知识。微服务是一种架构风格,因此这种风格的实现可能会有很大的差异,并且经常是一个备受争议的话题。然而,大多数专家认为微服务具有以下属性:松散耦合 容易维护 独立部署翻译 2021-01-21 09:46:47 · 372 阅读 · 0 评论 -
改进你的c#代码的5个技巧(四)
像每一篇文章一样,我会重复几行。我在我的Core i3 CPU、4GB主内存和Windows 7平台上测试了以下代码。如果你在不同的硬件配置或使用不同的平台,那么你的输出可能会随着我的输出屏幕而变化,并且输出可能会根据当前运行的进程而变化。由于所有的点都是性能测试,我已经在发布模式下对它们进行了测试,并在一个稳定的情况下对所有代码进行了截图。让我们从第一条建议开始。如何检查代码中的空字符串?在这一点上,我将向你展示三种空或空字符串检查样式。我希望你熟悉所有的风格,但可能不熟悉他们的表现。让我们从翻译 2021-01-19 10:54:33 · 259 阅读 · 0 评论 -
.NET 5网络操作的改进
随着.net 5在11月的发布,现在是谈论网络栈中许多改进的好时机。这包括对HTTP、套接字、与网络相关的安全性和其他网络通信的改进。在这篇文章中,我将重点介绍一些版本中更有影响力和更有趣的变化。HTTP更好的错误处理自从.net 3.1发布以来,HTTP领域进行了许多改进和修复。当使用HttpClien时,最受关注的是添加如何区分超时和取消。最初,不得不使用自定义的CancellationToken区分超时和取消:class Program{ private static .翻译 2021-01-18 09:30:28 · 583 阅读 · 0 评论 -
C#中的异步和多线程
许多开发人员对异步代码和多线程以及它们的工作原理和使用方法都有错误的认识。在这里,你将了解这两个概念之间的区别,并使用c#实现它们。我:“服务员,这是我第一次来这家餐厅。通常需要4个小时才能拿到食物吗?”服务员:“哦,是的,先生。这家餐厅的厨房里只有一个厨师。”我:“……只有一个厨师吗?”服务员:“是的,先生,我们有好几个厨师,但每次只有一个在厨房工作。”我:“所以其他10个穿着厨师服站在厨房里的人……什么都不做吗?厨房太小了吗?”服务员:“哦,我们的厨房很大,先生。”我:“那为翻译 2021-01-16 09:06:09 · 748 阅读 · 0 评论 -
ASP.NET Core中的数据保护
在这篇文章中,我将介绍ASP.NETCore 数据保护系统:它是什么,为什么我们需要它,以及它如何工作。为什么我们需要数据保护系统?数据保护系统是ASP.NET Core使用的一组加密api。加密必须由不受信任的第三方处理的数据。这方面的典型例子是身份验证cookie。cookie是在请求之间持久化状态的一种方法。你不希望每次向服务器请求时都必须提供用户名和密码,这将非常麻烦!相反,只需向服务器提供一次凭据。服务器验证你的详细信息,并发出一个cookie,表明“他不需要提供任何其他证明.翻译 2021-01-16 08:45:07 · 423 阅读 · 1 评论 -
改进你的c#代码的5个技巧(三)
本文完全独立于前两篇文章。如果你喜欢它们,我希望你也会喜欢这个。在上一篇文章中,我展示了哪种方法更快,并比较了代码的执行速度。在本文中,我将展示不同代码片段的内存消耗情况。为了显示内存映射和分配图,我使用了CLR profiler 32位版本,和往常一样,我在Windows平台上使用了4GB RAM和Core i3 CPU。内存消耗或分配图可能根据系统运行的进程而变化。因此,如果你得到一个不同的输出或行为的代码,那么请与我们分享你的经验。让我们开始“改进c#代码的5个技巧:第3部分”的旅程。Str翻译 2021-01-15 08:45:26 · 216 阅读 · 0 评论 -
在.NET Core中使用Channel(三)
到目前为止,我们一直在使用所谓的“Unbounded”通道。你会注意到,当我们创建通道时,我们这样做:var myChannel = Channel.CreateUnbounded<int>();但实际上,我们可以这样做:var myChannel = Channel.CreateBounded<int>(1000);这与创建容量有限的列表或数组等其他集合类型并无太大差别。在我们的示例中,我们创建了一个最多容纳1000项的Channel。但为什么要限制自己呢?这就翻译 2021-01-11 09:11:55 · 1240 阅读 · 0 评论 -
在.NET Core中使用Channel(二)
在我们之前的文章中,看了一些非常简单的例子来说明Channel是如何工作的,我们看到了一些非常漂亮的特性,但大多数情况下它与其他某某Queue实现非常相似。让我们进入一些更高级的话题。我说的是高级,但其中很多都非常简单。读/写分离如果你曾经在两个类之间共享队列,你就会知道任何一个类都可以读/写,即使它们本不应该这样做。例如:class MyProducer{ private readonly Queue<int> _queue; public MyProdu翻译 2021-01-09 10:07:34 · 882 阅读 · 0 评论 -
在.NET Core中使用Channel(一)
我最近一直在熟悉.net Core中引入的新Channel<T>类型。我想在它第一次发布的时候我了解过它,但是有关文章非常非常少,我不能理解它们与其他队列有什么不同。在使用了一段时间后,我终于看到了它们的吸引力和真正的力量。最值得注意的是大型异步后台操作,这些操作几乎需要双向通信来同步它们正在做的事情。这句话有点拗口,但希望在本系列文章结束时,你会清楚什么时候应该使用Channel<T>,什么时候应该使用一些更基本的东西,比如Queue<T>。Channel是什翻译 2021-01-08 09:13:07 · 1593 阅读 · 0 评论 -
将WCF迁移到gRPC
使用protobuf-net.Grpc将WCF服务迁移到gRPC非常简单。在这篇博文中,我们将看看它到底有多简单。微软关于将WCF服务迁移到gRPC的官方指南只提到了Gooogle.Protobuf方式,如果你有很多数据契约需要迁移到.proto格式,这可能会很耗时。然而,通过使用protobuf-net.Grpc我们能够重用旧的WCF数据契约和服务契约,而只需要做最小的代码更改。迁移数据契约和服务契约在本节中,我们将使用一个简单的请求响应的组合服务,它可以让你下载给定交易者的单个投资组合或所.翻译 2021-01-07 09:25:24 · 609 阅读 · 0 评论 -
改进你的c#代码的5个技巧(二)
在本文中,我将向你展示c#编程的5个最佳实践。我从日常编程经验中学到了这些实践。我在release模式下测试了所有的代码,并在开发环境稳定后进行了截屏。我想你会喜欢这些建议的。在使用数据类型之前选择它对于许多类型,我们宁愿不决定在日常编程生活中使用什么数据类型。就在几个月前,我也是其中之一。但是当我开始学习编程中的最佳实践以提高代码性能时,我了解到了错误的数据类型是如何影响代码的。我将展示一个演示来证明这个概念。static void Main(string[] args) {翻译 2021-01-06 08:47:10 · 225 阅读 · 0 评论 -
改进你的c#代码的5个技巧(一)
亲爱的读者,在这篇文章中,我提供了一些c#编程的最佳实践。你是否在用户输入验证中使用异常处理机制?如果是,那么你就是那个把你的项目执行速度降低了62倍的人。你不相信我吗?等几分钟;我来教你怎么做。但是在这个例子之前,让我们了解一下在什么地方需要异常处理。例如,你正在验证用户的数据,对于任何无效的输入,你将引发一个异常并将其抛出给客户端,如下所示:class BusinessLogcCheck { public void Check() {翻译 2021-01-04 09:16:12 · 199 阅读 · 0 评论 -
在 ASP.NET Core和Worker Service中使用Quartz.Net
现在有了一个官方包Quartz.Extensions.Hosting实现使用Quartz.Net运行后台任务,所以把Quartz.Net添加到ASP.NET Core或Worker Service要简单得多。我将展示如何把Quartz.Net HostedService添加到你的应用,如何创建一个简单的IJob,以及如何注册它与trigger。简介——什么是Quartz.NetQuartz.Net是一个功能齐全的开源作业调度系统,可以在最小规模的应用程序到大型企业系统使用。有许多ASP.翻译 2020-12-31 09:18:40 · 1453 阅读 · 0 评论 -
.NET 5 源代码生成器——MediatR——CQRS
在这篇文章中,我们将探索如何使用.NET 5中的新source generator特性,使用MediatR库和CQRS模式自动为系统生成API。中介者模式中介模式是在应用程序中解耦模块的一种方式。在基于web的应用程序中,它通常用于将前端与业务逻辑的解耦。在.NET平台上,MediatR库是该模式最流行的实现之一。如下图所示,中介器充当所发送命令的发送方和接收方之间的中间人。发送者不知道也不关心谁在处理命令。使用MediatR,我们定义了一个command,它实现IRequest&.翻译 2020-12-30 09:32:56 · 632 阅读 · 0 评论 -
C#中的依赖注入和IoC容器
在本文中,我们将通过用C#重构一个非常简单的代码示例来解释依赖注入和IoC容器。简介:依赖注入和IoC乍一看可能相当复杂,但它们非常容易学习和理解。在本文中,我们将通过在C#中重构一个非常简单的代码示例来解释依赖注入和IoC容器。要求:构建一个允许用户查看可用产品并按名称搜索产品的应用程序。第一次尝试:我们将从创建分层架构开始。使用分层架构有多个好处,但我们不会在本文中列出它们,因为我们关注的是依赖注入。下面是应用程序的类图:首先,我们将从创建一个..翻译 2020-12-29 09:22:25 · 531 阅读 · 0 评论 -
C#中的深度学习(五):在ML.NET中使用预训练模型进行硬币识别
在本系列的最后,我们将介绍另一种方法,即利用一个预先训练好的CNN来解决我们一直在研究的硬币识别问题。在这里,我们看一下转移学习,调整预定义的CNN,并使用Model Builder训练我们的硬币识别模型。我们将使用ML.NET代替Keras.NET。为什么不使用Keras.NET呢?尽管Keras.NET非常简单,易于学习,虽然它包含前面提到的预定义模型,但它的简单性使我们无法自定义CNN架构来适应我们的问题。ML.NET是一个微软的免费机器学习框架,旨在使用C#和F#进行开发。最重要的是,我翻译 2020-12-25 08:27:19 · 1579 阅读 · 0 评论 -
C#中的深度学习(二):预处理识别硬币的数据集
在文章中,我们将对输入到机器学习模型中的数据集进行预处理。这里我们将对一个硬币数据集进行预处理,以便以后在监督学习模型中进行训练。在机器学习中预处理数据集通常涉及以下任务:清理数据——通过对周围数据的平均值或使用其他策略来填补数据缺失或损坏造成的漏洞。 规范数据——将数据缩放值标准化到一个标准范围,通常是0到1。具有广泛值范围的数据可能会导致不规范,因此我们将所有数据都放在一个公共范围内。 一种热编码标签——将数据集中对象的标签或类编码为N维二进制向量,其中N是类的总数。数组元素都被设置为0,除翻译 2020-12-22 13:24:01 · 484 阅读 · 0 评论 -
C#中的深度学习(一):使用OpenCV识别硬币
在本系列文章中,我们将使用深度神经网络(DNN)来执行硬币识别。具体来说,我们将训练一个DNN识别图像中的硬币。在本文中,我们将描述一个OpenCV应用程序,它将检测图像中的硬币。硬币检测是硬币完整识别之前的一个常见阶段。它包括从给定图像中检测和提取硬币。本系列附带的代码将使用Keras在C#中实现。在本系列的最后一篇文章中,我们将简要地使用ML.NET。在众多选择中,为什么要使用Keras.NET呢?Keras.NET非常容易学习,因为它基本上是从Python编写的经典TensorFlow到.翻译 2020-12-21 13:28:36 · 1334 阅读 · 1 评论 -
.NET生态系统掠影
如果你是一名开发人员,想要进入到.NET的世界,你需要知道都有哪些可能。由于..NETFramework是..NET生态系统中最流行的技术,你可以用它来构建各种各样的应用程序,但是最近,出现了一些新的东西,比如 .NET Core 和.NET Standard library。我们可以在项目或构建中使用它吗?在.NET生态系统中使用特定的技术堆栈会产生一些困惑,因为有很多选择,比如应该使用哪种类型的运行时?在这篇文章中,我们将试图把这些要点都说清楚。众所周知.NET是一个由微软创建的开源开发平台,.翻译 2020-12-17 15:50:44 · 450 阅读 · 0 评论