.Net Core3.0 WebApi 一:实现简单的Resful Api
.Net Core3.0 WebApi 目录
开发环境
Visual Studio 2019
.net core 3.1
创建项目
新建.net core web项目,如果没有安装.net core sdk的使用vs2019的安装中心安装,这里默认已经安装了.net core 3.1
此处我们选择API(选择API系统会为我们自动创建WebApi需要的一些配置文件等),Https配置这一项我们暂时不勾选,目前我们不配置Https。
点击创建,完成后,如下图所示:(我在这里创建了几个解决方案文件,用于代码分布,个人习惯)
Program.cs 说明
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
这个Program是程序的入口, 看起来很眼熟, 是因为asp.net core application实际就是控制台程序(console application).
它是一个调用asp.net core 相关库的console application.
Main方法里面的内容主要是用来配置和运行程序的.
因为我们的web程序需要一个宿主, 所以 BuildWebHost这个方法就创建了一个WebHostBuilder. 而且我们还需要Web Server.
asp.net core 自带了两种http servers, 一个是WebListener, 它只能用于windows系统, 另一个是kestrel, 它是跨平台的.
kestrel是默认的web server, 就是通过UseKestrel()这个方法来启用的.
但是我们开发的时候使用的是IIS Express, 调用UseIISIntegration()这个方法是启用IIS Express, 它作为Kestrel的Reverse Proxy server来用.
如果在windows服务器上部署的话, 就应该使用IIS作为Kestrel的反向代理服务器来管理和代理请求.
如果在linux上的话, 可以使用apache, nginx等等的作为kestrel的proxy server.
当然也可以单独使用kestrel作为web 服务器, 但是使用iis作为reverse proxy还是有很多有优点的: 例如,IIS可以过滤请求, 管理证书, 程序崩溃时自动重启等.
UseStartup<Startup>(), 这句话表示在程序启动的时候, 我们会调用Startup这个类.
Build()完之后返回一个实现了IWebHost接口的实例(WebHostBuilder), 然后调用Run()就会运行Web程序, 并且阻止这个调用的线程, 直到程序关闭.
Startup.cs 说明
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
其实Startup算是程序真正的切入点.
ConfigureServices方法是用来把services(各种服务, 例如identity, sqlsugar,swagger等等包括第三方的, 或者自己写的)加入(register)到container(asp.net core的容器)中去, 并配置这些services. 这个container是用来进行dependency injection的(依赖注入). 所有注入的services(此外还包括一些框架已经注册好的services) 在以后写代码的时候, 都可以将它们注入(inject)进去. 例如上面的Configure方法的参数, app, env, loggerFactory都是注入进去的services.
Configure方法是asp.net core程序用来具体指定如何处理每个http请求的, 例如我们可以让这个程序知道我使用路由规则来处理http请求, 那就调用app.UseRouting()这个方法就行
项目调试
.net core 调试的两种方法有两种,IIS调试和项目自带的Kestrel web应用调式,这里从 launchsettings.json删除IIS调试使用Kestrel web就行。
launchsettings.json是程序的启动配置文件,关于 launchsettings.json可以参考https://www.cnblogs.com/wer-ltm/p/11028234.html
运行程序
浏览器显示的是官方提供的一个现实天气信息的api
创建第一个Controller
删除系统默认创建的WeatherForecastController.cs
和WeatherForecast.cs并在controller文件夹
新建一个控制器,命名:UserController.cs
新建成功之后如下所示:
namespace WebApi.Core.Api.Controllers { [Route("api/[controller]")] [ApiController] public class UserController : ControllerBase { } }
我们在UserController
中增加一个hello
的get
方式的接口方法,返回一个hello world
,我们打算通过请求api/user/hello
来得到这个hello
[Route("api/[controller]")] [ApiController] public class UserController : ControllerBase { [HttpGet] public IActionResult Hello() { return Ok("Hello World , Core3.0 WebApi"); } }
运行,如下所示:
有些运行是会提示404,我在最开始的时候也遇到过,之前的一篇随笔也有记录到。404不用紧张,我们找到问题所在就好了。
首先在Controller中将[Route("[controller]")]====》[Route("api/WeatherForecast")],再在launchSettings.json中做修改。
这样就OK了。
增加全局路由
上面增加action
虽然能达到想要的结果,但是每次新建一个Controller
都有写个action,有点麻烦,如果哪天领导不高兴,要改规则,有点麻烦的,如果定义一个全局规则,那么只需要修改一个地方,所有的规则都变了。
首先去掉Controller里的Route
和ApiController
修改Startup.cs
,增加路由模版
这样所有的控制台都可以遵循这个规则来访问。