从零开始搭建.NET Core 2.0 API(学习笔记一)
从零开始搭建.NET Core 2.0 API(学习笔记一)
一、 VS 2017 新建一个项目 选择ASP.NET Core Web应用程序,再选择Web API,选择ASP.NET Core 2.0版本
二、 添加API帮助页面 API项目添加 NuGet NSwag.AspNetCore 引用, 然后在添加NSwag设置
运行项目 http://localhost:prot/swagger 即可打开帮助页。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseSwaggerUi(typeof(Startup).GetTypeInfo().Assembly, settings =>
{
settings.GeneratorSettings.DefaultPropertyNameHandling = PropertyNameHandling.CamelCase;
});
app.UseMvc(route =>
{
route.MapRoute(name: "default", template: "{controller=Home}/{action=Get}/{id?}");
});
}
三、 Startup 类ConfigureServices方法中,添加配置中心初始化;配置中心统一管理配置,便于维护
public IServiceProvider ConfigureServices(IServiceCollection services)
{
ConfigHelper.Init(Configuration["ConfigZookeeperAddress"], Configuration["ConfigNodePath"]);
services.AddSingleton<ILogWrite, LogWrite>(); services.AddMvc(options =>
{
options.Filters.Add<AuthorizationFilter>();
options.Filters.Add<ExceptionFilter>();
options.Filters.Add<PerformanceLogFilter>();
}); var builder = new ContainerBuilder();//实例化 AutoFac 容器
builder.Populate(services); // TODO: 这里添加其他需要注入类的注册 ApplicationContainer = builder.Build();
return new AutofacServiceProvider(ApplicationContainer);
}
四、添加一个基础设置项目,添加一个日志接口 ILogWrite,一个记录日志实现类 LogWrite 在Startup 类ConfigureServices方法中添加日志 Ioc
因为日志拦截器和异常拦截器会用到日志记录需要注入 所以日志在AddMvc()前面添加,Autofac配置不能在 AddMvc前面,所以这里用.NET Core的Ioc容器,后面Autofac会接管容器。
services.AddSingleton<ILogWrite, LogWrite>();
五、filter 添加三个类分别是
a AuthorizationFilter 权限过滤器
b ExceptionFilter 异常过滤器
c PerformanceLogFilter 性能日志过滤器
ExceptionFilter 、PerformanceLogFilter 分别定义构造函数,注入日志依赖。
public ExceptionFilter(ILogWrite logWrite)
{
_logWrite = logWrite;
} public PerformanceLogFilter(ILogWrite logWrite)
{
_logWrite = logWrite;
}
过滤器必须添加在 Startup类ConfigureServices的services.AddMvc()中
services.AddMvc(options =>
{
options.Filters.Add<AuthorizationFilter>();
options.Filters.Add<ExceptionFilter>();
options.Filters.Add<PerformanceLogFilter>();
});
六、Action参数读取,为了在异常过滤器、性能日志过滤器中,读取参数需要在权限过滤器中添加下面两行代码
public class AuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
HttpRequest request = context.HttpContext.Request;
request.EnableRewind();
request.Body.Position = 0;
}
}
七、性能日志过滤器 PerformanceLogFilter 继承 IActionFilter,实现两个接口
OnActionExecuting 在调用操作方法之前发生
OnActionExecuted 在调用操作方法之后发生
a 在方法 OnActionExecuting中 实例化一个 Stopwatch 用于记录方法开支执行时间
把Stopwatch 实力加入 HttpContext.Items 中,便于在 OnActionExecuted 获取。
b 读取Action请求参数, 放入 HttpContext.Items 中, 不知道为什么OnActionExecuted 去不到参数
/// <summary>
/// 在调用操作方法之前发生。
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
//
if (SkipLogging(context)) return; var watch = new Stopwatch();
context.HttpContext.Items[ConfigHelper.HttpRequestStopWatcher] = watch;
var paramenters = context.ActionArguments.Count==0?string.Empty:context.ActionArguments.Serialize();
context.HttpContext.Items[ConfigHelper.FilterActionArguments] = paramenters;
watch.Start();
}
OnActionExecuting 中增加了性能日志开关,如果关闭直接返回,不创建Stopwatch,
在OnActionExecuted中回去到的Stopwatch是null 则直接返回(也可以用性能日志开关做判断),不处理后续。
如果Controll、Action添加了NoLog特性,则不记录性能日志
private static bool SkipLogging(ActionExecutingContext actionContext)
{
if (!ConfigHelper.IsPerformanceLog) return true;
return actionContext.ActionDescriptor.GetType().GetCustomAttributes(typeof(NoLogAttribute), false).Any() ||
actionContext.Controller.GetType().GetCustomAttributes(typeof(NoLogAttribute), false).Any();
}
/// <summary>
/// 忽略性能日志记录特性
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true)]
public class NoLogAttribute : Attribute
{
}
八、异常过滤器
/// <summary>
/// 异常拦截器
/// </summary>
public class ExceptionFilter : IExceptionFilter
{
ILogWrite _logWrite;
public ExceptionFilter(ILogWrite logWrite)
{
_logWrite = logWrite;
} /// <summary>
///
/// </summary>
/// <param name="actionExecutedContext"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public void OnException(ExceptionContext context)
{
BizResult<bool> biz; var paramenters = context.HttpContext.Items[ConfigHelper.FilterActionArguments].ToString();
try
{
biz = new BizResult<bool>(false, (int)B2CBizCode.Exception, context.Exception.Message); if (context.Exception.InnerException != null)
biz.SysMessage += ":" + context.Exception.InnerException.Message; if (ConfigHelper.IsPerformanceLog)
{
var watch = context.HttpContext.Items[ConfigHelper.HttpRequestStopWatcher] as Stopwatch;
watch?.Stop(); var name = context.ActionDescriptor.GetType().GetProperty("ActionName").GetValue(context.ActionDescriptor).ToString(); _logWrite.InfoAsync(new
{
CreateTime = DateTime.Now,
Method = name,
TimeSpan = watch.Elapsed,
IsSuccess = false,
Content = paramenters,
Code = ((B2CBizCode)biz.BusinessCode).ToString(),
Message = biz.BusinessMessage
}.Serialize());
}
}
catch (Exception ex)
{
biz = new BizResult<bool>(false, (int)B2CBizCode.Exception, ex.Message);
}
context.Result = new ApplicationErrorResult(biz); _logWrite?.ErrorAsync($"链接访问出错:{context.HttpContext.Request.Path}", context.HttpContext.Request.Method, this.GetType().Name, context.Exception, paramenters);
return;
}
} public class ApplicationErrorResult : ObjectResult
{
public ApplicationErrorResult(object value) : base(value)
{
StatusCode = (int)HttpStatusCode.InternalServerError;
}
}
九 、添加Autofac,Autofac比.NET Core自带的 Ioc更好用。 NuGetAPI 项目中添加Autofac.Configuration、Autofac.Extensions.DependencyInjection 两个引用 然后 ConfigureServices方法中添加Ioc容器
public IServiceProvider ConfigureServices(IServiceCollection services)
{
ConfigHelper.Init(Configuration["ConfigZookeeperAddress"], Configuration["ConfigNodePath"]);
services.AddSingleton<ILogWrite, LogWrite>(); services.AddMvc(options =>
{
options.Filters.Add<AuthorizationFilter>();
options.Filters.Add<ExceptionFilter>();
options.Filters.Add<PerformanceLogFilter>();
}); var builder = new ContainerBuilder();//实例化 AutoFac 容器
builder.Populate(services); // TODO: 这里添加其他需要注入类的注册 ApplicationContainer = builder.Build();
return new AutofacServiceProvider(ApplicationContainer);
}
至此.NET Core API的 拦截器、配置管理、日志、Ioc 设置已完成。
public IServiceProvider ConfigureServices(IServiceCollection services) { ConfigHelper.Init(Configuration["ConfigZookeeperAddress"], Configuration["ConfigNodePath"]); services.AddSingleton<ILogWrite, LogWrite>();
services.AddMvc(options => { options.Filters.Add<AuthorizationFilter>(); options.Filters.Add<ExceptionFilter>(); options.Filters.Add<PerformanceLogFilter>(); });
var builder = new ContainerBuilder();//实例化 AutoFac 容器 builder.Populate(services);
// TODO: 这里添加其他需要注入类的注册
ApplicationContainer = builder.Build(); return new AutofacServiceProvider(ApplicationContainer); }
从零开始搭建.NET Core 2.0 API(学习笔记一)的更多相关文章
- node+webpack环境搭建 vue.js 2.0 基础学习笔记
npm install -g vue //全局安装vue npm install -g webpack //全局安装webpack npm install -g vue-cli //全局安装vue-c ...
- Windows录音API学习笔记(转)
源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息 结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...
- Windows录音API学习笔记
Windows录音API学习笔记 结构体和函数信息 结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD wMid; 用于波形 ...
- Windows录音API学习笔记--转
Windows录音API学习笔记 结构体和函数信息 结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { WORD wMid; 用于波形 ...
- TCP协议和socket API 学习笔记
本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类: 原文地址:TCP协议和socket API 学习笔记 作者:gilb ...
- 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2 任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- Node.js API 学习笔记
常用 API 学习笔记 url 函数 url.parse: 解析 url 地址 url.resolve: 向 url 地址添加或替换字段 url.format: 生成 url 地址 querystri ...
- ASP.NET Core 1.0: API的输入参数
Web API是需要接受参数的,譬如,通常用于创建数据的POST method需要接受输入数据,而用于GET method也需要接受一些可选参数,譬如:为了性能起见,控制返回数据的数量是至关重要的. ...
随机推荐
- angular 的杂碎报错小知识
1:[ng:areq] Angular出现这种错误的原因,是由于没有在页面中使用模块引入controller导致的 所以 请确保你定义了这个controller后也引用了它. 2:Failed to ...
- OpenWrt添加启动脚本
1.在 /etc/init.d 目录下建立文件 vi silabs #!/bin/sh /etc/rc.common # Copyright (C) 2006 OpenWrt.org START=93 ...
- JavaScript,Dom,jQuery
JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript 语言的规则编写相应代码,浏览器可以解释出相应的处理. 注 ...
- Druid 0.2.25版本hive jdbc 不支持 conn.getHoldability() 兼容处理问题
背景: 用Druid做Oracle的连接池感觉还不错,近日新项目要用Hive,故而也想使用Duid来做Hive的连接池.试了试果真可以,也没报错.但是,过了一段时间,同样的代码却出问题了.离奇的是我同 ...
- eclipse中创建包时变成文件夹,且文件夹内的类无法被其他类引用
1.检查该文件夹是否已经被配置到了工程的build path里source folders ===>右键工程 选Build Path->Configure Build Path就可以看到 ...
- 网络监控之一:ss(Socket Statistics)
ss是Socket Statistics的缩写. 顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的 ...
- java中内部类的讲解
java中有一个内部类的概念,由于之前一直比较忙,没有单独拿出时间总结一下,今天我就把内部类的相关知识进行一下汇总,如果有不足之处,欢迎批评指正. 1)java内部类的概念. 在一个类的的 ...
- C语言在32位和64位机器下数字数据类型的字节数取决于编译器和平台, 主要由编译器决定。
C语言中数字数据类型的字节数 C声明 32位机器 64位机器 char 1 1 short int 2 2 int 4 4 //整型在32位和64位下都是4个字节 long int 4 8 l ...
- windows异常演示,指定异常类型,然后生成异常
#include "stdafx.h"#include <Windows.h>#include <float.h> DWORD Filter (LPEXCE ...
- 10-26C#基础回顾、汇总(函数重点)
第一部分==进制转换 重点记忆: 1.任意进制转十进制 按权展开法 p代表进制数,a/b/c...m分别代表进制数p从右往左第1位--第(n-1)位的数 公式:a*p0+b*p1+c*p2+..... ...