web API .net - .net core 对比学习-文件目录概述
个人正在学习.net web Api的相关知识,因此用这一系列博客做一记录。
1. 首先我们分别创建 .net web api 项目和 .net core web api 项目。
2. 我们首先比较一下两个项目的目录结构。
下图中是用 vs2017 创建的 .net web api(左)和.net core web api(右) 项目。
从目录结构上我们可以看出 .net web api 除了controller 意外还保留了view, model 和一些放静态文件(fonts, script, content)的文件夹,除此之外还有area 文件夹,学过 asp.net mvc的同学应该会了解area的概念,我们不再赘述。
除此之外还有favorite.ico 文件,如果我们用这个项目作为一个单纯的web api 项目我们会发现除了model以外以上提到的其他的我们都可以完全删除。
然后是web.config 来管理我们asp.net 的一些相关配置,在.net core web api 项目中有类似作用的appsettings.json 文件,如果我们需要发布.net core web api 到IIS上也需要加上我们自己的web.config文件。
packages.config 文件是包管理相关的配置文件。
3. 入口文件比较
Global.asax.cs 文件是.net web api 的入口文件(因为我建立的是基于 MVC 的web api项目,因此入口文件跟asp.net mvc 是一样的)。由下面的代码我们可以看出来在WebApiApplication类里面的Application_Statr 方法里面注册了项目所需要的一些配置。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace FreWebApi
{
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); //注册area
GlobalConfiguration.Configure(WebApiConfig.Register); //注册web api 路由
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);//注册全局过滤器
RouteConfig.RegisterRoutes(RouteTable.Routes);//注册asp.net mvc 路由,当项目单纯用于作为api使用可以不注册asp.net 路由
BundleConfig.RegisterBundles(BundleTable.Bundles);// 注册bundles 也不是web api所必须的
}
}
}
而.net core web api 项目的入口文件是Program.cs 文件。从下面的代码我们可以看出来我们的入口方法是Program类里面的Main方法(是不是很熟悉的感觉),从code上我们可以看出只是在Main方法里面调用了CreateWebHostBuilder方法。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; namespace CoreWebApi
{
public class Program
{
/// <summary>
/// 入口是 Main 方法看起来跟console项目有些类似。
/// </summary>
/// <param name="args"></param>
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();//在 Main 方法直接调用下面的CreateWebHostBuilder方法。
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}
}
学过Asp.net MVC 的同学大家都知道,在Application_Statr注册的配置项其实都是在App_Start文件夹里面,下面我们展开这个文件夹。
从上图中的文件来看我们很容易看出来对应的配置在那个文件里面,前面提到过RouteConfig和BundleConfig不是wenApi所必须的所以我们还是重点来看一些WebApiConfig和FilterConfig.
1) FilterConfig: 这个类里面默认添加了HandleErrorAttribute这是一个全局过滤器,主要用于处理异常。
using System.Web;
using System.Web.Mvc; namespace FreWebApi
{
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
}
}
2)WebApiConfig: 注册了webApi的路由,这些路由是在HttpConfiguration实例的Routes集合属性里面,这里我们注意我们这里注册的都是http路由,当注册asp.net mvc 路由时,是放在RouteTable.Routes集合里面。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http; namespace FreWebApi
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务 // Web API 路由
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
说到这里有的同学可能会奇怪我们的 .net core web API的各种配置又在哪里呢?我们接着看我们入口类里面的CreateWebHostBuilder方法,在这个方法里面用Lambda表达式调用了WebHost的CreateDefaultBuilder方法,官网的解释如下:
Initializes a new instance of the WebHostBuilder class with pre-configured defaults.
使用预先配置的默认值初始化WebHostBuilder类的新实例。
如果需要获取详细信息的同学,可以参见其他专门将asp.net 的博客这里我们只将项目结构。然后我们调用的这个实例的UseStartup方法,官网解释如下:
Specify the startup type to be used by the web host.
指定Web Host要使用的启动类.
同样的我们对此不做深究,但我们可以从解释中看出来这里指定了启动类,然后我们打开传入的泛型类Startup,我们打开Startup.cs文件,查看里面的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; namespace CoreWebApi
{
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.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
} app.UseHttpsRedirection();
app.UseMvc();
}
}
}
从上面的code上我们可以看到里面有ConfigService方法和Config方法,但是我们并没有看到类似与.net web api的关于注册路由或者过滤器的任何code,不要慌我们来改写一下ConfigService和config方法。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(
options =>
{
options.Filters.Add<ExceptionFilterAttribute>(); // an instance
}
).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
} app.UseHttpsRedirection();
app.UseMvc(
routes => routes.MapRoute(
name: "default",
template: "{ controller}/{ action}/{ id}"
)
); }
从上面改写以后的方法里面我们就可以清晰的看到过滤器和路由的配置了。
最后我们来展开controllers文件夹:
从下图中我们看到 .net web api生产了两个默认的controller,让我们查看两个controller的定义:
由下面的代码我们明显的看到HomenController是为Asp.Net mvc准备的,继承于Controller类,而ValuesController才是我们真正需要的web api的controller继承于ApiController 类。
public class HomeController : Controller public class ValuesController : ApiController
最后我们来比较一下两个Api的controller:
从下图中我们可以看出两个API的主要不用在于controller的父类不同,然后是asp.net core 默认使用了路由属性,这也是它可以再config里面默认没有配置路由的原因。
web API .net - .net core 对比学习-文件目录概述的更多相关文章
- web API .net - .net core 对比学习-使用Swagger
根据前两篇的介绍,我们知道.net web api 和 .net core web api在配置方面的不同如下: 1. .net web api的配置是在 App_Stat文件夹里面添加对应的配置类, ...
- web API .net - .net core 对比学习-依赖注入
今天我们来看一下 .net web api 和 .net core web api依赖注入机制的差异. 首先我们分别在.net web api 和 .net core web api新建文件夹Serv ...
- Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
详情请查看http://aehyok.com/Blog/Detail/67.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
- Asp.Net Web API 2 官网菜鸟学习系列导航
链接地址: http://www.cnblogs.com/aehyok/p/3446289.html
- angular4和asp.net core 2 web api
angular4和asp.net core 2 web api 这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net ...
- 【转】asp.net Core 系列【二】—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API
在本教程中,将生成用于管理“待办事项”列表的 Web API. 不会生成 UI. 概述 以下是将创建的 API: API 描述 请求正文 响应正文 GET /api/todo 获取所有待办事项 无 待 ...
- [整理]ASP.NET WEB API 2学习
目录 1 快速入门 1.1实例 1.1.1初识WEB API 2 1.1.2 Action Results 的改变 1.1.3 路由的新增特性 1.1.4 消息管道的变化 1.1.4.1 HttpMe ...
- win 10+ iis 10 部署.net core 1.1 web api
今天上午部署了wcf,部署了好久,一直没有部署好,最后找到了dudu的部署方法,结果中午吃饭的时候成功了,这是链接:http://www.cnblogs.com/dudu/p/3328066.html ...
- Advanced Architecture for ASP.NET Core Web API
转自: https://www.infoq.com/articles/advanced-architecture-aspnet-core ASP.NET Core's new architecture ...
随机推荐
- C语言之“字符”与“字符串”之间的区别解析
在C语言中,“字符”与“字符串”之间,是有区别的.这一篇文章中,我们将介绍一下,在C语言中的“字符”与“字符串”,它们之间的区别. 首先,一个很明显的区别是: “字符”,使用单引号作为定界符,而“字符 ...
- js -ajax 学习
2.ajax 1)跨域 $.ajax({ type : "get", data : "data_xName=" + data_xNa ...
- 【Gamma】Scrum Meeting 2
目录 写在前面 进度情况 任务进度表 Gamma阶段燃尽图 遇到的困难 照片 写在前面 例会时间:5.26 22:30-23:00 例会地点:微信群语音通话 代码进度记录github在这里 临近期末, ...
- Tensorflow 损失函数(loss function)及自定义损失函数(三)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/limiyudianzi/article ...
- Unity制作出《超级马里奥》的2D和3D混合效果
现在来做点别的东西.Nintendo Switch上刚推出的<超级马里奥>中,有一些关卡混合了2D和3D的画面,这种效果十分让人印象深刻.如何在Unity中实现这个效果呢? 正常情况下,摄 ...
- 003 okhttp超时与缓存
上文的介绍都没添加,如果要添加,则按照下面的方式设置. File sdcache = getExternalCacheDir(); int cacheSize = 10 * 1024 * 1024; ...
- Linux远程连接ssh工具(FinalShell)xshell替代神器
对对对 FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本2.9.8,更新时间2019.6.19 wntr 2017-01-17 11:0 ...
- 006-tomcat 多实例安装、appBase和docBase、Context说明
一.多实例部署 主要是为了充分利用服务器资源,并且可以交叉部署应用.主要做法可以有使用docker部署,多实例部署. 多实例多应用:多个 Tomcat 部署多个不同的项目.这种模式在服务器资源有限,或 ...
- 泡泡一分钟:Real-Time Vehicle Detection from Short-Range Aerial Image with Compressed MobileNet
张宁 Real-Time Vehicle Detection from Short-Range Aerial Image with Compressed MobileNet链接:https://pan ...
- Jmeter通过SSHCommand测试获取Linux服务器资源文件信息
有些时间我们想通过接口测试来获取服务器上面的某个资源文件信息,应该怎么办? 别急.... Jmeter通过ssh协议可以实现这个操作. 下面来看一下具体的实现吧. 需要提前安装好的工具: 1.按照好j ...