ASP.NET Core

ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

六眼飞鱼酱① 提交于 2020-07-28 03:01:16
通过上文所介绍的内容,我们已经完成了RESTful API的开发,现在,就可以使用Azure DevOps来进行持续集成(CI)和k8s持续部署(CD)了。本文我会对使用Azure DevOps进行CI/CD的过程中需要注意的地方进行详细介绍,而对于Azure DevOps配置的详细步骤,我不会做太多注解,大家可以参考我前面写的《 ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署 》系列文章。 在使用Azure DevOps进行CI/CD之前,首先来了解一下整个开发部署的架构拓扑,下图展示了基于Azure DevOps进行持续集成和持续部署的架构拓扑: 我们首先使用Visual Studio 2019来开发ML.NET模型训练的项目,用以生成训练模型,并使用Visual Studio 2019开发了基于ASP.NET Core的RESTful API,这些代码都由Azure DevOps Repo进行托管。然后,Azure DevOps Build Pipeline会对源代码进行编译,将RESTful API应用程序编译成docker镜像然后推送到Azure Container Registry上,并执行模型训练程序,产生训练模型ZIP文件,并由Release Pipeline将训练模型保存到Azure Blob Storage中。Release

【asp.net core 系列】- 11 Service层的实现样板

 ̄綄美尐妖づ 提交于 2020-07-28 01:46:27
0.前言 在《asp.net core 系列》之实战系列中,我们在之前的篇幅中对项目有了一个大概的认知,也搭建了一个基础的项目骨架。那么就让我们继续完善这个骨架,让它更加丰满。这一篇,我将带领小伙伴们一起实现用户管理功能。 1. 数据表 一般情况下,我们会把用户表和登录信息表放在两个表里。为什么会这样设计呢?出于以下几种考虑: 使功能分割,用户信息管理是用户管理,登录是登录 增加安全,降低无关信息的查询,例如访问登录接口不会连带检索用户的普通信息,当进行用户信息管理的时候,不会把登录信息也带过来 等等 废话不多说,直接上代码: namespace Data.Enums { /// <summary> /// 登录类型 /// </summary> public enum LoginType : byte { /// token登录 Token, /// 用户名密码 Password } /// <summary> /// 性别 /// </summary> public enum SexEnum { /// 男 Male, /// 女 Female, /// 隐私 None } } SysUserAuthEntity.cs using Data.Enums; using Data.Infrastructure; namespace Data.Models { public

在.NET Core中设计自己的服务宿主(Service Hosting)框架

好久不见. 提交于 2020-07-27 23:08:22
很多时候我们都会有设计一个后台服务的需求,比如,传统的Windows Service,或者Linux下的守护进程。这类应用的一个共同特点就是后台运行,并且不占用控制台界面。通常情况下,后台服务在提供服务时,会通过日志输出来记录服务处理的详细信息,用户也可以根据具体需要来设置不同的日志级别(Log Level),从而决定日志的输出详细程度。无论是传统的Windows Service还是Linux守护进程,都是开发人员非常熟悉的应用程序形式,开发技术和开发模式都是大家所熟知的,那么,在.NET Core中,又如何 专业地 实现这类后台服务应用呢? 其实,.NET Core的开发人员应该早就接触过并且使用过某种基于.NET Core的后台服务的开发技术了,它就是ASP.NET Core。ASP.NET Core应用程序在启动后,通过监听端口接受来自客户端的HTTP请求,然后根据路由策略定位到某个控制器(Controller)的某个方法(Action)上,接着将处理结果又以HTTP Response的形式返回给客户端(此处描述省略了Filter等步骤)。ASP.NET Core作为后台服务的一个最大特点是,它是专为HTTP协议定制的,也就是说,ASP.NET Core有着非常强大的处理HTTP协议与通信管道的能力。很显然,在某些场景中,服务端与客户端的通信并非基于HTTP协议

在 Xunit 中使用依赖注入

萝らか妹 提交于 2020-07-27 22:32:27
在 Xunit 中使用依赖注入 Intro 之前写过一篇 xunit 的依赖注入相关的文章,但是实际使用起来不是那么方便 今天介绍一个基于xunit和微软依赖注入框架的“真正”的依赖注入使用方式 ——— Xunit.DependencyInjection , 来自大师的作品,让你在测试代码里使用依赖注入像 asp.net core 一样轻松 使用一览 包引用 在 xunit 测试项目里添加对 Xunit.DependencyInjection 的引用 dotnet add package Xunit.DependencyInjection 新建自己的 Startup 需要实现自己的一个 Startup ,在 Startup 里进行服务注册和初始化 // 这里需要指定一个 assembly attribute 用来让 xunit 寻找测试入口,使用自定义的测试框架 // TestFramework 第一个参数是 Startup 类的 FullName(包含命名空间),第二个参数是测试项目的程序集名称 [assembly: TestFramework("XUnitDependencyInjectionSample.Startup", "XUnitDependencyInjectionSample")] namespace XUnitDependencyInjectionSample {

TechEmpower Web 框架性能第19轮测试结果正式发布,ASP.NET Core在主流框架中拔得头筹

醉酒当歌 提交于 2020-07-27 22:00:44
TechEmpower 第19轮编程语言框架性能排行榜2020年5月28日正式发布,详见官方博客: https://www.techempower.com/blog/2020/05/28/framework-benchmarks-round-19/ ,TechEmpower基准测试有许多场景(也称为测试类型),此次评测多了一个综合评分选项,把拥有完整测试覆盖的框架现在将具有综合 分数 ,这反映了测试项目类型的总体性能得分:JSON serialization, Single-query, Multi-query, Updates, Fortunes 和 Plaintext. 。对于每一轮,我们使每个测试类型的结果规范化,然后为每个测试类型应用主观权重(例如,Fortunes的权重比 Plaintext 高,因为Fortunes 是一种更现实的测试类型)。asp.net core排第6名,asp.net 排名倒数第二,第103名, 微软从倒数一路追赶到第一。 表上前缀T标签表示精选的主流编程语言 第1名 C++的drogon 9676分 第2名 Rust的actix 9064分 第6名 C#的ASP.NET Core 5659分 第29名 Go的Chi 2229分 第34名 Java的Spring 1867分 第73名 Nodejs的Express 821分 第94名

重学ASP.NET Core 中的标记帮助程序

∥☆過路亽.° 提交于 2020-07-27 11:43:52
标记帮助程序是什么 标记帮助程序使服务器端代码可以在 Razor 文件中参与创建和呈现 HTML 元素。 例如,内置的 ImageTagHelper 可以将版本号追加到图片名称。 每当图片发生变化时,服务器都会为图像生成一个新的唯一版本号,因此客户端总能获得当前图像(而不是过时的缓存图像)。 作者:依乐祝 原文链接: https://www.cnblogs.com/yilezhu/p/13197922.html 标记帮助程序的作用域是如何控制的 标记帮助程序作用域由 @addTagHelper 、 @removeTagHelper 和“!”选择退出字符等联合控制。下面就一一的进行相关的介绍吧。 使用 @addTagHelper 添加标记帮助程序 @addTagHelper 指令让视图可以使用标记帮助程序。 在这种情况下,视图文件是_pages/ ViewImports ,默认情况下,它由_pages_文件夹和子文件夹中的所有文件继承,这使得标记帮助程序可用。 这里公开标记帮助程序有两种方式,如下所示: 第一种:使用通配符语法(" * ")指定指定程序集( AspNetCore )中的所有标记帮助程序都可用于_Views_目录及其子目录中的每个视图文件。 @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers 第二种

VS2019启用Docker支持的坑

霸气de小男生 提交于 2020-07-27 11:31:22
使用vs2019创建ASP.Net Core Web应用程序: 右侧高级选项中有一项启用Docker支持,勾选后vs会自动帮我们创建Dockerfile: 看一下Dockerfile的内容: #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["WebApplication1/WebApplication1.csproj", "WebApplication1/"] RUN dotnet restore "WebApplication1/WebApplication1.csproj" COPY . . WORKDIR "/src/WebApplication1" RUN dotnet build "WebApplication1.csproj"

Asp.net Core中实现自定义身份认证

☆樱花仙子☆ 提交于 2020-07-27 09:05:03
Asp.Net Core中虽然集成了许多常用的身份认证,但很多时候,我们还是需要实现自己的身份认证接口,本文这里就简单的介绍下如何实现自定义身份认证接口。 首先写一个简单的接口。 [ Authorize ] [ HttpGet ] public object Foo () { return DateTime . Now . ToString (); } 由于有Authorize标记,访问函数体前会判断用户是否通过认证,由于这里没有通过认证,会的得到一个500错误。 自定义认证处理类: 实现一个IAuthenticationHandler接口即可: 1 public class MyAuthHandler : IAuthenticationHandler 2 { 3 public const string SchemeName = " MyAuth " ; 4 5 AuthenticationScheme _scheme; 6 HttpContext _context; 7 8 /// <summary> 9 /// 初始化认证 10 /// </summary> 11 public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context) 12 { 13 _scheme = scheme; 14

【asp.net core 系列】8 实战之 利用 EF Core 完成数据操作层的实现

大憨熊 提交于 2020-07-27 08:26:59
0. 前言 通过前两篇,我们创建了一个项目,并规定了一个基本的数据层访问接口。这一篇,我们将以EF Core为例演示一下数据层访问接口如何实现,以及实现中需要注意的地方。 1. 添加EF Core 先在数据层实现层引入 EF Core: cd Domain.Implements dotnet add package Microsoft.EntityFrameworkCore 当前项目以SqlLite为例,所以再添加一个SqlLite数据库驱动: dotnet add package Microsoft.EntityFrameworkCore.SQLite 删除 Domain.Implements 里默认的Class1.cs 文件,然后添加Insfrastructure目录,创建一个 DefaultContext: using Microsoft.EntityFrameworkCore; namespace Domain.Implements.Insfrastructure { public class DefaultContext : DbContext { private string ConnectStr { get; } public DefaultContext(string connectStr) { ConnectStr = connectStr; }

学习ASP.NET Core(08)-过滤搜索与分页排序

拟墨画扇 提交于 2020-07-27 07:21:12
上一篇我们介绍了AOP的基本概览,并使用动态代理的方式添加了服务日志;本章我们将介绍过滤与搜索、分页与排序并添加对应的功能 注:本章内容大多是基于solenovex的 使用 ASP.NET Core 3.x 构建 RESTful Web API 视频内容,若想进一步了解相关知识,请查看原视频 一、过滤与搜索 1、定义 1、什么是过滤?意思就是把某个字段的名字及希望匹配的值传递给系统,系统根据条件限定返回的集合内容; 按点外卖的例子来说,食物类别、店铺评分、距离远近等过滤条件提供给你,您自个儿根据需求筛选,系统返回过滤后的内容给你; 2、什么是搜索?意思就是把需要搜索的值传递给系统,系统按照其内部逻辑查找符合条件的数据,完成后将数据添加到集合中返回; 还是按点外卖的例子来说,一哥们张三特别喜欢吃烧烤,他在搜索栏中搜索烧烤,会出现什么?食物类别是烧烤的,店铺名称是烧烤的,甚至会有商品名称包含烧烤的,当然具体出现什么还要看系统的内部逻辑; 3、相同点及差异 相同点:过滤和搜索的参数并不是资源的一部分,而是使用者根据实际需求自行添加的; 差异:过滤一般是一个完整的集合,根据条件把匹配或不匹配的数据移除; ​ 搜索一般是一个空集合,根据条件把匹配或不匹配的数据往里面添加 2、实际应用 1、在前面的章节我们有提到过数据模型的概览,即用户看到的和存储在数据库的可能不是一个字段