.net core 3.0 踩坑日记
三天前,老大要求把一个项目从java改到.net。因为没碰过.net,便开始了磕磕绊绊的踩坑之旅。
1. https问题。
在刚开始熟悉.net时,使用vs自动生成了一个webapi的项目,但是问题出现了,使用浏览器可以调用接口,但是postman调用就不会有返回。
后来发现vs会默认把为https配置
勾选,vs会自己生成一个证书,但是postman不认这个证书。 后来将该配置项取消得以解决。
2. 使用.net core 3。
原先使用vs2017,但是查找的时候,怎么也找不到.net core 3,只有2.1,找了好久发现篇博客安装.NET Core 3.0预览版后VS项目目标框架中不显示的解决方法。 试过后发现不行,还是找不到。 后来换成vs2019得到解决。
3. .net core使用DI。
因为是从java项目转过来的,在java中习惯使用spring的我,第一时间想找到一个.net的依赖注入的库。 在这里先感谢一位b站up主 solenovex
,他的ASP.NET Core MVC 入门教程 (共9集)对我帮助很大。其中讲了一些启动时,默认的配置,其中就包括默认的DI。使用起来也很简单,在Startup.cs
类的ConfigureServices
方法中,将类添加到IOC容器中,使用时在构造方法中声名该类型即可注入。
// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
// 将WeatherForecastService添加到IOC容器中
services.AddSingleton<WeatherForecastService>();
}
// WeatherForecastController.cs
private WeatherForecastService _weatherForecastService;
public WeatherForecastController(WeatherForecastService weatherForecastService)
{
// 在构造函数中直接注入
_weatherForecastService = weatherForecastService;
}
4. 分环境生效的配置文件
在Properties下的launchSettings.json
中,有个叫ASPNETCORE_ENVIRONMENT
的参数,这个参数控制生效的配置文件。
在项目启动时,默认会加载appsetting.json
和appsetting.{env}.json
,结果取两个json合并后的结果,如果有key值相同,appsetting.{env}.json会覆盖appsetting.json。
5. 获取配置文件
获取appsetting.json中的配置信息,将想要的格式建好一个类之后,在Startup.cs
中将该配置注册一下就可以在想要使用时将该配置注入进来。
// appsetting中的配置信息
/*
{
"Build": {
"Number": 1,
"Env": "Local"
}
}
*/
// Startup.cs 中将想要注册的配置放进services中,并指明类型
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Build>(Configuration.GetSection("Build"));
}
// WeatherForecastController.cs中在构造器中直接注入
private IOptions<Build> _buildConf;
public WeatherForecastController(ILogger<WeatherForecastController> logger,
WeatherForecastService weatherForecastService,
IOptions<Build> buildConf)
{
_logger = logger;
this.weatherForecastService = weatherForecastService;
_buildConf = buildConf;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
// 想要使用时,直接可以获取到一个强类型的对象,从中取配置即可
Build buildConf = _buildConf.Value;
string env = buildConf.Env;
int number = buildConf.Number;
Console.WriteLine("env : " + env + " buildNum : " + number);
return weatherForecastService.GetForecasts();
}
// 输出结果:
// env : Local buildNum : 1
这种获取配置的方法要求必须有个实体类和配置文件对应,过于繁琐。 后续会寻找更方便的方法获取配置。