个人正在学习.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 对比学习-文件目录概述的更多相关文章

  1. web API .net - .net core 对比学习-使用Swagger

    根据前两篇的介绍,我们知道.net web api 和 .net core web api在配置方面的不同如下: 1. .net web api的配置是在 App_Stat文件夹里面添加对应的配置类, ...

  2. web API .net - .net core 对比学习-依赖注入

    今天我们来看一下 .net web api 和 .net core web api依赖注入机制的差异. 首先我们分别在.net web api 和 .net core web api新建文件夹Serv ...

  3. Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]

    详情请查看http://aehyok.com/Blog/Detail/67.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  4. Asp.Net Web API 2 官网菜鸟学习系列导航

    链接地址: http://www.cnblogs.com/aehyok/p/3446289.html

  5. angular4和asp.net core 2 web api

    angular4和asp.net core 2 web api 这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net ...

  6. 【转】asp.net Core 系列【二】—— 使用 ASP.NET Core 和 VS2017 for Windows 创建 Web API

    在本教程中,将生成用于管理“待办事项”列表的 Web API. 不会生成 UI. 概述 以下是将创建的 API: API 描述 请求正文 响应正文 GET /api/todo 获取所有待办事项 无 待 ...

  7. [整理]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 ...

  8. win 10+ iis 10 部署.net core 1.1 web api

    今天上午部署了wcf,部署了好久,一直没有部署好,最后找到了dudu的部署方法,结果中午吃饭的时候成功了,这是链接:http://www.cnblogs.com/dudu/p/3328066.html ...

  9. Advanced Architecture for ASP.NET Core Web API

    转自: https://www.infoq.com/articles/advanced-architecture-aspnet-core ASP.NET Core's new architecture ...

随机推荐

  1. Mongoose 索引

    Mongoose 索引介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更 快(如果有些字段是用不着的就不要设置索引).MongoDB 的索引几乎与传统的关系型数据库一 ...

  2. SpringBoot激活profiles

    多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在SpringBoot内支持了多种配置隔离的方式,可以激活单个或者多个配置文件. 激活Profiles的 ...

  3. WIN10 删除此电脑7个文件夹-REG运行代码

    Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ ...

  4. python gaussian,gaussian2

    import numpy as np import matplotlib.pyplot as plt import mpl_toolkits.axisartist as axisartist from ...

  5. 【转】Android 将自己的应用改为系统应用

    所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定.减少内存(DATA)空间占用.恢复出厂设置后不会消失.修改系统时间.调用隐藏方法.系统关机重启.静默安装升级卸载应用等 ...

  6. tensorflow 笔记 16:tf.pad

    函数: tf.compat.v1.pad tf.pad 函数表达式如下: tf.pad(    tensor,    paddings,    mode='CONSTANT',    name=Non ...

  7. 泡泡一分钟:Robust Attitude Estimation Using an Adaptive Unscented Kalman Filter

    张宁 Robust Attitude Estimation Using an Adaptive Unscented Kalman Filter 使用自适应无味卡尔曼滤波器进行姿态估计链接:https: ...

  8. [windows bat]如何启动一个新的cmd窗口并在其内执行命令

    两种方式: start cmd /k echo Hello, World! # # 执行完毕以后,新开的窗口不会自动关闭 start cmd /C pause # 执行完毕以后,新开的窗口会自动关闭 ...

  9. SpringCloud基础

    SpringCloud极大的简化了分布式系统的开发,实现了微服务的快速部署和灵活应用 SpringCloud主要框架 * 服务发现--Netfix Eureka * 服务调用--Netfix Feig ...

  10. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之多方式虚拟直播

    EasyDSS流媒体解决方案之虚拟直播 虚拟直播相对于传统的实时直播的差别在于,实时的直播在于播放的是一个实时的直播流,而虚拟直播,可能适应范围更加的广.虚拟直播,不仅仅可以播放实时的视频直播流,也可 ...