之前记在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学习笔记的更多相关文章

  1. Asp.net core 学习笔记 ( Data protection )

    参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...

  2. Asp.net core 学习笔记 SignalR

    refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...

  3. Asp.net core (学习笔记 路由和语言 route &amp; language)

    https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...

  4. Asp.net core 学习笔记 (授权)

    更新 : 2018-11-24 记入一些思考 asp.net core + identity 的权限是这样的 user = 1 个登入账号 role = 1 个角色 (类似于公司里的一个职位) cla ...

  5. Asp.net core 学习笔记 ( identity server 4 JWT Part )

    更新 : id4 使用这个 DbContext 哦 dotnet ef migrations add identity-server-init --context PersistedGrantDbCo ...

  6. Asp.net core 学习笔记 ( Web Api )

    asp.net core 把之前的 webapi 和 mvc 做了结合. mvc 既是 api. 但是后呢,又发现, api 确实有独到之处,所以又开了一些补助的方法. namespace Proje ...

  7. Asp.net core 学习笔记 ( IIS, static file 性能优化 )

    更新 : 2019-02-06 最后还是把 rewrite 给替换掉了. 所以 rewrite url 也不依赖 iis 了咯. refer : https://docs.microsoft.com/ ...

  8. Asp.net core 学习笔记 QR code and Barcode

    QR code 和 Barcode 经常会使用到. Java 阵营有著名的 zxing https://github.com/zxing/zxing .Net 有对接它的 port https://g ...

  9. Asp.net core 学习笔记 ( HttpClient )

    2018-09-18 core 2.1 之后有新的方案咯 http://www.talkingdotnet.com/3-ways-to-use-httpclientfactory-in-asp-net ...

随机推荐

  1. 在 ML2 中配置 Vlan Network- 每天5分钟玩转 OpenStack(93)

    上一节我们学习了 Neutron Vlan Network 的原理,今天讨论如何在 ML2 配置中 enable 它. 首先在 /etc/neutron/plugins/ml2/ml2_conf.in ...

  2. IOS在线安装App

    在越狱设备上可以安装,如果设备不越狱也想安装,就要企业发布权限了,可惜我没有,所以不能测试了! 1.创建ipa及plist文件: XCode菜单栏->Product->Archive-&g ...

  3. oracle如何写包

    一:如何使用FOR循环二:如何使用拼接语句 EXECUTE IMMEDIATE v_sql INTO v_WORK_ORDERID;三:如何定义记录类型做为变量,用于存储及查询 CREATE OR R ...

  4. Codeforces Round #353 (Div. 2)Restoring Painting

    Vasya works as a watchman in the gallery. Unfortunately, one of the most expensive paintings was sto ...

  5. textarea 超过字数

    <textarea name="></textarea> <div id="statementRowChk"></div> ...

  6. Reachability几个常用方法

    http://oncerios.diandian.com/post/2013-06-28/40050041969

  7. cocos2d-x 在mac下执行 demo

    搞了好久,最终成功了. 记录一下 前辈的文章. 依照这个弄的 .http://blog.csdn.net/taowenyin/article/details/11750127 前辈的这个文章是在win ...

  8. jre配置了1.6,但是eclipse仍然提示需要1.6以上的java

    问题: eclipse创建web项目时,提示错误:Dynamic Web Module 3.0 requires Java 1.6 or newer. 原因: 这是因为当前的编译器java版本太低,请 ...

  9. VOJ 1067 Warcraft III 守望者的烦恼 (矩阵高速功率+dp)

    主题链接 明显的 dp[n] = dp[n-k] + dp[n-k+1] + ... +dp[n-1]; 然后要用矩阵来优化后面的状态转移. 也就是矩阵 0 1 0 0    a     b 0 0 ...

  10. Ubuntu+Django+mod_wsgi+Apache配置过程

    Ubuntu15.10 Apache2.4( sudo apt-get install apache2 ) Python3.4( sudo apt-get install apache2 ),  [系 ...