Asp.net Core学习笔记
之前记在github上的,现在搬运过来
变化还是很大的,感觉和Nodejs有点类似,比如中间件的使用 ,努力学习ing...
优点
- 不依赖IIS
- 开源和跨平台
- 中间件支持
- 性能优化
- 无所不在的依赖注入
- 标准日志记录
- Mvc 和 WebApi 合二为一
- MVC 标签帮助
- CLI工具
1.cookie 和 Session
因为《通用数据保护条例》(General Data Protection Regulation,简称GDPR)为欧洲联盟于2018年5月25日出台的条例, Asp.Net Core 2.1中已经应用了这个条例,需要用户同意才可以使用cookie和session
但是可以通过修改 Startup.cs中的 options.CheckConsentNeeded的返回值为false就可以使用了
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
// options.CheckConsentNeeded = context => true;
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
但是,规定出来了,还是要遵守的 可以通过一些复杂的设置来 达到同样的效果,可以查看文档(https://blog.csdn.net/canduecho/article/details/80651853)
Cookie 使用方式
//设置Cookie
Response.Cookies.Append("Name", "BOB", new CookieOptions { Expires = DateTime.Now.AddDays(3)});
//获取cookie
string name=HttpContext.Request.Cookies["Name"];
//删除Cookie
Response.Cookies.Delete("Name");
Session
需要修改Startup.cs 中ConfigureServices方法 添加session服务.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddSession();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
然后在Configure方法中注册中间件 app.UseSession();
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
读/写Session
//设置session
HttpContext.Session.SetString("User", JsonConvert.SerializeObject(new Models.User { Id = 1, Name = "Alice" }));
//获取session
Models.User user = JsonConvert.DeserializeObject<Models.User>(HttpContext.Session.GetString("User")) as Models.User;
2.Filter
在Startup.cs中修改中ConfigureServices方法,这样就是全局过滤器了,
全局过滤器配置
services.AddMvc(o =>
{
new Filter.MyFilter();//自定义过滤器
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
具体的过滤器区别不大.. 还是和 Asp.Net Mvc 一样..这里只举例了一种ActionFilter
public class MyFilter : Attribute,IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
}
public void OnActionExecuting(ActionExecutingContext context)
{
if (context.HttpContext.Request.Cookies["Name"]==null)
{
context.HttpContext.Response.Redirect("http://www.baidu.com");
}
}
}
3.IOC 和 DI
什么是IOC和DI可以看看这篇文章,我觉得讲的不错(https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html)
使用方式
public class TestService: ITestService //这里不能漏哦,不然注入的时候转换失败...
{
public TestService()
{
MyProperty = Guid.NewGuid();
}
public Guid MyProperty { get; set; }
public List<string> GetList(string a)
{
return new List<string>() { "LiLei", "ZhangSan", "LiSi" };
}
}
对应的接口
public interface ITestService
{
Guid MyProperty { get; }
List<string> GetList(string a);
}
然后using Microsoft.Extensions.DependencyInjection;
public void ConfigureServices(IServiceCollection services)
{
//这里就是注入服务
services.AddTransient(typeof(ITestService), typeof(TestService));
//如果是泛型类的话 需要这么写
services.AddTransient(typeof(ITestService<>),typeof(TestService<>));
}
AddTransient就是注入的方法之一,前面一个是你服务的接口,第二个是服务的实现类..
使用 Swagger
1.Nuget 安装 Swashbuckle.AspNetCore
2.在startup.cs中的 ConfigureServices 方法中增加
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new Info
{
Version = "v1",
Title = "StudentManager API",
Description = "A simple example ASP.NET Core Web API"
});
//获取xml路径 加载xml
var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);//获取应用程序所在目录(绝对,不受工作目录影响,建议采用此方法获取路径)
var xmlPath = Path.Combine(basePath, "StudentManager.WebApi.xml");
c.IncludeXmlComments(xmlPath);
//实体层xml
c.IncludeXmlComments(Path.Combine(basePath, "StudentManager.Entity.xml"));
});
3.在 Configure 方法中增加
//启用中间件服务生成Swagger作为JSON终结点
app.UseSwagger();
//启用中间件服务对swagger-ui,指定Swagger JSON终结点
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "StudentManager Api");
//设置根节点为SwaggerUI
c.RoutePrefix = string.Empty;
});
4.访问 http://localhost:/swagger 即可看到效果
5.更多设置查看(https://www.cnblogs.com/yilezhu/p/9241261.html) 或(https://www.cnblogs.com/yanbigfeg/p/9232844.html)
EF Core 启用延迟加载
- 之前写博客api的时候总是出现导航属性取值为null的问题,用了特性标签关联数据都不行,后面找到原因了 是没有启用延迟加载,
- 启用延迟加载,在EF Core 2.1中我们需要下载【Microsoft.EntityFrameworkCore.Proxies】包 在context文件中重写OnConfiguring方法 还有导航属性必须用virtual关键字修饰!! 具体详情[http://www.cnblogs.com/CreateMyself/p/9195131.html]
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies(true);
}
- 启用了延迟加载 就会有循环引用的问题,我们需要在ConfigureServices方法中进行如下配置才行。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
}
WebApi传参困惑
前端如果是FromForm的话
$.ajax({
type: "POST",
url: 'http://localhost:51543/api/values',
data: {
Num:5,
Sum:10
},
success: function(data){
console.log(data);
},
contentType: 'application/x-www-form-urlencoded'
});
[HttpPost]
public IActionResult Post([FromForm]NumNum n)
{
return new JsonResult(n.Num);
}
如果是传递json的话
$.ajax({
type: "POST",
url: 'http://localhost:51543/api/values',
data: JSON.stringify({
Num:5,
Sum:10
}),
success: function(data){
console.log(data);
},
contentType: 'application/json'
});
[HttpPost]
public IActionResult Post([FromBody]NumNum n)
{
return new JsonResult(n.Num);
}
Asp.net Core学习笔记的更多相关文章
- Asp.Net Core学习笔记:入门篇
Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...
- ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探
前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...
- ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用
前言 首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果.还记得上篇文章中最后提及到,假如服务越来越多怎 ...
- ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置
前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...
- ASP.NET Core 学习笔记 第五篇 ASP.NET Core 中的选项
前言 还记得上一篇文章中所说的配置吗?本篇文章算是上一篇的延续吧.在 .NET Core 中读取配置文件大多数会为配置选项绑定一个POCO(Plain Old CLR Object)对象,并通过依赖注 ...
- Asp.net core 学习笔记 ( Data protection )
参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...
- Asp.net core 学习笔记 SignalR
refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...
- Asp.net core (学习笔记 路由和语言 route & language)
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...
- Asp.net core 学习笔记 (授权)
更新 : 2018-11-24 记入一些思考 asp.net core + identity 的权限是这样的 user = 1 个登入账号 role = 1 个角色 (类似于公司里的一个职位) cla ...
随机推荐
- OpenCV编程->RGB直方图统计
我们在处理彩色图像时.特别是在做局部图像的阈值切割时,须要一个直观的RGB统计图. 接下来開始实现. 代码: void CalcHistRGB() { IplImage* img_sou ...
- windows中检查端口占用
在cmd中怎么输入netstat -aon|findstr "9080" 返回: UDP 0.0.0.0:8001 *.* 其中的4220为进城PID
- Kindeditor API
根据map规则删除range中的element或attribute. cmd.remove({ span : '*', div : 'class,border' }); commonNode(ma ...
- iOS tabbar 上面更换任意图
tabbar 对add 上面的图片 有一层默认虚化 对于这种系统高度继承后的 控件 处理办法就是自定义 解决方案 1.放在tabbar 上的图片 不能太小 不然裁剪后 会很模糊 2 .通过裁剪 压缩的 ...
- Java编程思想(第4版) 中文清晰PDF完整版
Java编程思想(第4版) 中文清晰PDF完整版 [日期:2014-08-11] 来源:Linux社区 作者:Linux [字体:大 中 小] <Java编程思想>这本书赢得了全 ...
- css 分析
.important.warning {background:silver;} .important .warning {background:silver;} //上面有什么区别? //1.2个选择 ...
- Java多线程系列 面试题
1. https://blog.csdn.net/jjj19891128/article/details/24393661 多线程经典面试题 2. https://blog.csdn.net/ll6 ...
- 【leetcode刷题笔记】Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...
- running a background task over ssh
原文: Why does running a background task over ssh fail if a pseudo-tty is allocated? 问题: I've recently ...
- JavaScript秘密
对象 对象使用和属性 JavaScript 中所有变量都可以当作对象使用,除了两个例外 null 和 undefined. false.toString(); // 'false' [1, 2, 3] ...