NetCore基础1. WebApi 默认控制器简单说明
Posted wosperry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NetCore基础1. WebApi 默认控制器简单说明相关的知识,希望对你有一定的参考价值。
默认控制器说明
- 此文档是个人经验分享,希望能够帮助到有需要的朋友。
- 如果存在错误,您就说一下,我改。
- Gitee代码库(分支
practice/01/框架生成的控制器
): https://gitee.com/wosperry - 微软文档
如果是刚刚接触DotnetCore,什么都还不清楚的情况,可以先模仿项目自动生成的WeatherForecastController添加自己的控制器,先写一些Api接口尝试调用一下,其他的东西都可以先不看。哪怕你把所有逻辑都写在控制器(完全不建议),都是可以运行的。
路由
- 特性
[Route("")]
- 可以添加给
Controller
或者方法
- 参数:
- 参数内容即是路由
[controller]
控制器名[action]
方法名
当控制器名为XxxController
方法名为Hahaha()
时,路由是\\Xxx\\Hahaha
- 可以添加给
- Http方法的特性:
[HttpGet()]
[HttpPost()]
等- 仅可以添加给
方法
- 参数内容即是路由
- 仅可以添加给
WebApi框架项目默认控制器说明(项目生成文件)
// Api控制器特性:默认HttpPost时,参数从Body获取,等价于不添加时在Api参数标识[FromBody]特性
[ApiController]
// 表示一级路由是 \\WeatherForecast
// 一般不直接使用 [controller]
[Route("[controller]")]
// 控制器基类 ControllerBase,继承此类后会在程序运行时被框架发现,提供一些控制器常用方法
// 如 BadRequest(string message), Ok(string message)等,具体可F12查看
public class WeatherForecastController: ControllerBase
{
// 说明:默认项目只是个例子,可以参考,不想看也没关系
// 这是一个字段:静态 私有 只读,字符串数组,用于后面随机展示
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
// 这是一个字段:一个类型参数为当前类型的一个日志服务,由构造方法的注入得到实例
private readonly ILogger<WeatherForecastController> _logger;
// 这个类的构造方法
// 注入说明:
// 1. 此构造方法不在任何地方被手动调用
// 2. 类的构造方法由框架自动发现,并使用最多参数的构造方法进行构造,在构造前会递归构造出所有参数的实例
// 3. 参数可以是非常多,需要用到什么服务,就在参数添加
// 具体可搜索 IOC控制反转、DI依赖注入
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
// 由于作用域关系,构造函数结束后,会被系统GC回收
// 保存到类的字段中,即可在类的整个生命周期中被保留使用
_logger = logger;
}
// Http方法,标识了HttpGet特性时,只接收HttpGet请求,如果Http方法不匹配则不接受
// HttpGet特性可以接受一个字符串参数,此参数作用与[Route()]相同,会被认为是二级路由
[HttpGet]
// 以下是一个普通方法,返回的结果会被自动转成Json格式给到接口消费者
public IEnumerable<WeatherForecast> Get()
{
// 一个随机数类
var rng = new Random();
// Enumerable.Range(1, 5) :从1开始,获取5个整数(参数介绍可F12)
// .Select() :投影方法,等同于写了一个foreach方法拼接 List<WeatherForecast> 类型结果
// 不同的是Select是一个迭代器,性能略好于自行遍历,返回值类型为IEnumerable。
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
// 上述内容执行结果简单写法:
/*
public IEnumerable<WeatherForecast> GetWeatherForecasts()
{
var random = new Random();
var list = new List<WeatherForecast>();
for (int index = 1;index <= 5; index++)
{
list.Add(new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = random.Next(-20, 55),
Summary = Summaries[random.Next(Summaries.Length)]
});
}
return list;
}
*/
}
}
NetCore WebAPI开发探索
一、创建项目
新建api项目:
建好之后,一个默认的控制器已经有了:
运行就可以直接访问get接口获取数据:
二、跨平台部署
部署方面,微软已经完善的很好了,基本上算是傻瓜式操作。项目右键选择发布:
部署模式可以采用框架依赖,或独立,选择框架依赖,则需要在目标平台安装netcore运行时后才能运行netcore程序。
平台可以选择windows或linux:
发布完成后,直接运行“dotnet *.dll”即可将api服务建立起来,默认建立http的5000端口和https的5001端口,可直接访问。
三、客户端访问代码
/// <summary> /// post函数 /// </summary> /// <param name="url">服务器post地址</param> /// <param name="args">api参数</param> async void PostData(string url, string[] args) var httpClient = new HttpClient(); //Post数据序列化 var json = Newtonsoft.Json.JsonConvert.SerializeObject(args); var stringContent = new StringContent(json); stringContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); //设定安全协议,不然访问默认的netcore地址会报错:基础流已关闭 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; var response = await httpClient.PostAsync(url, stringContent); var str = await response.Content.ReadAsStringAsync(); Console.WriteLine("post:" + str);
四、遇到的问题与解决
在本机用localhost,127.0.0.1等地址访问都没问题,当想测试linux环境,在centos虚拟机里服务运行后,在本机就是无法访问,但是在虚拟机内部又是没问题的。通过搜索引擎查询并解决,下面是问题与解决方法,排名不分先后。
1.运行报错Couldn‘t find a valid ICU package installed on the system.
安装icu库,运行命令:yum install icu
2.防火墙问题
(1) 查看状态:firewall-cmd --state
(2) 关闭防火墙:systemctl stop firewalld
3.外部无法访问
默认的localhost只能本地访问,需要在代码中指定:WebHost.CreateDefaultBuilder(arg).UseUrls("http://*:5000") .UseStartup<Startup>();
或在部署是直接指定:dotnet *.dll --urls http://*:5000
4.连接sqlserver2008R2服务器超时
Netcore在linux下如果SqlServer2008低于SP3版本,会出现连接超时的问题。只要去官方下载SqlServer 2008 Sp3 补丁安装即可。
https://www.cnblogs.com/weiweithe/p/7810803.html
五、卷尾
Netcoreapi提供了一个新的解决方案,方便用户采用同一套代码构建跨平台程序,大大减少了开发工作量。微软正在准备NetCore3.0的发布,面向图形化界面的开发,发布后netcore的应用面应该会更广。
学海无涯,共同进步。
以上是关于NetCore基础1. WebApi 默认控制器简单说明的主要内容,如果未能解决你的问题,请参考以下文章
.NetCore WebApi —— Swagger版本控制
NetCore偶尔有用篇:NetCore项目WebApi返回Json属性大小写
在.net core 的webapi项目中将对象序列化成json