本系列文章主要记录Web API使用过程中的一些个人总结,包括创建API项目、基础配置、ApiTestClient使用与HelpPage页面的优化、Owin与OAuth的使用等。

  本节主要内容是API项目的创建和基本的配置

  Aps.net Web API是构建Restful应用程序的.net框架,关于其相关介绍文档等请访问微软的 ASP.NET Web APIs

   目录

  项目创建

  基本配置

    路由模板配置

    特性(属性)路由

    过滤器

    启动HelpPage页

    返回值格式更改(json、禁用自引用等)

    返回值日期格式

  错误与解决方案

  其它

  一、创建项目

  VS2017新建项目,选择Web下的Asp.NET Web应用程序

  

  点击“确定”后在选择API应用,如果需要单元测试项目可以勾选“添加单元测试”,会在创建API项目的同时一起创建单元测试项目

  

  点击确定,等待VS自动创建完成即可。创建完成后的项目结构基本跟Asp.NET MVC相似,但你会发现最明显的两个文件WebApiConfig.cs和ValueController.cs。

  WebApiConfig.cs在项目的App_Start目录下,只有一个Register方法,这里面包含了Web API的配置、服务、路由等信息;

  ValueController.cs在项目的Controllers目录下,是模板自带的一个Api接口示例,细心的你会发现它与MVC控制器的区别是,它继承自ApiController;

  至此,VS为我们创建好了一个带有示例的API项目,现在可以运行项目,尝试调用示例中的接口。备注:运行项目后我们可以输入localhost:端口/help,进入帮助页面查看所有的api接口列表。

  比如我们访问示例下的无参Get方法

  

  我们可以看到接口返回了一个xml结构的数据,其中包含了接口中预置的value1和value2,有细心的会发现,你不是要调用的Get么,为啥路径是api/Values而不是api/Values/Get,别着急这在接下来的配置中讲到,这属于API的路由规则配置。

  二、基本配置

  接下来对创建的api项目进行一些配置修改。

  1.路由模板格式修改(WebApiConfig文件)

  我们修改原路由配置(api/{controller}/{id})如下

  

      config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { id = RouteParameter.Optional }
);

  这样修改后路由的匹配规则就变成了api/控制器名/方法名,刚才我们的访问Get方法就不能使用api/Values而需要使用api/Values/Get了。当然如果你的接口是需要写在Areas下的话,可以将routTemplate改为ap/{controller}/{action},或再添加一条路由规则

  2.特性(属性)路由

  特性路由的启用是在WebApiConfig的Register方法中添加config.MapHttpAttributeRoutes();即可,默认的是启用了该配置的。

  之所以单独说一下是因为,使用特性路由的情况下WebApiConfig的注册只能使用GlobalConfiguration.Configure(WebApiConfig.Register),不能使用WebApiConfig.Register(GlobalConfiguration.Configuration)。

  属性路由也是将客户端的请求映射到对应的action上,但相对于通过模板、http方法等来设置路由更加灵活,并且一些个性的需求使用模板、管理等很难实现。参考 JIM.WEN 的web api Route属性定义

  

  3.过滤器

  Web API的过滤器主要有三种AuthorizationFilterAttribute、ActionFilterAttribute、ExceptionFilterAttribute,根据你的运用创造力可以实现很多的自定义操作(骚操作~),网上相关的使用示例讲解蛮多的,就不写了,可参考 尘嚣之上的webapi的几种过滤器。

  这里主要说一下ExceptionHandler和ExceptionLogger。为什么讲他们呢,是因为ExceptionFilterAttribute虽然可以定义全局异常处理,但是有一些异常它是不能处理的,例如:控制器构造函数的异常、消息处理程序异常、路由过程中的异常、序列化返回内容抛出的异常、其他过滤器的异常等。

  定义两个类分别继承自ExceptionHandler和ExceptionLogger:

  

    /// <summary>
/// 自定义异常处理
/// </summary>
public class CustomExceptionHandler : ExceptionHandler
{
public override void Handle(ExceptionHandlerContext context)
{
//可以处理一下统一的返回格式、自定义处理等
//content.Result
}
} /// <summary>
/// 自定义异常日志
/// </summary>
public class CustomExceptionLogger : ExceptionLogger
{
public override void Log(ExceptionLoggerContext context)
{
//可以处理下异常日志记录等
//context.Request.RequestUri--请求地址
//context.Request.Content--请求内容
//context.ExceptionContext.Exception--异常信息
}
}

  4.项目启动打开Help页

  启动API项目后,需要手动敲入/Help才能进入帮助文档页面,操作不是很友好,我们可以通过修改路由来实现启动后直接进入help页,代码如下(App_Start--RouteConfig):

  

         /// <summary>
///
/// </summary>
/// <param name="routes"></param>
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Help", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "SampleAPI.Areas.HelpPage.Controllers" }
).DataTokens.Add("Area", "HelpPage");
}

  5.返回数据格式修改(返回json格式数据)

  在WebApiConfig的Regiter中添加以下代码,即可

  

     // Web API 配置和服务

     //清除XML格式
config.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
//JSON格式
config.Formatters.Add(new JsonMediaTypeFormatter());

  再调用我们的Get方法,发现返回值已经是json格式的了

  

  返回Json数据序列化时针对返回结果的child自引用循环,我们可以设置忽略,我们这里使用的序列化插件是Newtonsoft.json,在WebApiConfig中增加如下配置

  

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
//忽略对象的child自引用循环
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

  6.返回结果中日期的统一格式化处理

  这里配置的是 “yyyy-MM-dd HH:mm:ss”格式,可根据自己的需要进行设置

  

   config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new IsoDateTimeConverter()
{
DateTimeFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss"
});

  三、错误与解决方案

  1.“该对象尚未初始化。请确保在所有其他初始化代码后面的应用程序启动代码中调用 HttpConfiguration.EnsureInitialized()。”

   或 “ValueFactory 尝试访问此实例的 Value 属性。”

   原因:启用了特性路由但WebApiCofig的注册又使用了WebApiConfig.Register(GlobalConfiguration.Configuration)

   解决方案:将WebApiCofig的注册方式改为GlobalConfiguration.Configure(WebApiConfig.Register)即可

   附:两种注册方式的区别 stackoverflow

  2.WebApi所有的接口访问全部404 找不到匹配的资源

   原因:api路由注册放在了mvc路由的后边

     解决方案:将GlobalConfiguration.Configure(WebApiConfig.Register)放到RouteConfig.RegisterRoutes(RouteTable.Routes)执行之前即可,别问我为什么,我也不明白这骚操作,

Web API使用记录系列(一)创建API项目与基本配置的更多相关文章

  1. Web API使用记录系列(二)HelpPage优化与WebApiTestClient

    继续使用记录的第二节,HelpPage的优化与测试工具WebApiTestClient的使用. 之前没怎么整理博客,都是记录一下笔记,真正好好整理发现没想像的那么简单.不管怎么说还是培养下写博客的习惯 ...

  2. SpringBoot01 InteliJ IDEA安装、Maven配置、创建SpringBoot项目、属性配置、多环境配置

    1 InteliJ IDEA 安装 下载地址:点击前往 注意:需要下载专业版本的,注册码在网上随便搜一个就行啦 2 MAVEN工具的安装 2.1 获取安装包 下载地址:点击前往 2.2 安装过程 到官 ...

  3. Web API使用记录系列(三)Web API与Owin

    还好在坚持,今天继续更新第三篇随笔----使用owin来启动WebAPI(这里还是以IIS为宿主,当然也可以使用别的如Console.Windows Server等) 关于OWIN(Open Web ...

  4. Web API使用记录系列(四)OAuth授权与身份校验

    呼,开干第四篇,基于OWIN搭建OAuth认证授权服务器与接口身份校验. OAuth包含授权码模式.密码模式.客户端模式和简化模式,这里我们文章记录的是密码模式和客户端模式. 目录 引用安装 授权处理 ...

  5. Android+Jquery Mobile学习系列(3)-创建Android项目

    前两章分别对开发环境和Jquery Mobile基础知识进行了介绍,本章介绍创建一个Android项目,并使用WebView控件显示HTML数据. 首先创建一个Android Application项 ...

  6. 使用PyCharm创建Django项目及基本配置

    https://segmentfault.com/a/1190000011576316 pycharm是个很不错的python开发工具,大大缩短了python项目的创建时间以及调试时间在使用pytho ...

  7. vue cli3 创建的项目中eslint 配置 问题的解决

    1--   vue cli3 项目文件结构 2-- 注释问题 在eslintrc.js 文件中,将 '@vue/standard' 注释后重启即可: 3-- 配置 eslint 文件 在 vue-cl ...

  8. java web开发入门九(Maven使用&idea创建maven项目)基于intellig idea

    Maven 1.解决的问题 jar包的依赖和管理:版本.依赖关系等 自动构建项目 2.maven介绍 1.Maven是什么? Apache Maven是一个软件项目管理的综合工具.基于项目对象模型(P ...

  9. Nodejs express中创建ejs项目,解决express下默认创建jade,无法创建ejs问题

    最近在看<Node.js开发指南>,看到使用nodejs进行web开发的时候,准备创建ejs项目遇到问题了, 书上命令为: express -t ejs microblog 可是执行后,仍 ...

随机推荐

  1. 《Java编程思想》阅读笔记二

    Java编程思想 这是一个通过对<Java编程思想>(Think in java)进行阅读同时对java内容查漏补缺的系列.一些基础的知识不会被罗列出来,这里只会列出一些程序员经常会忽略或 ...

  2. linux命令(6):tar命令

    压缩方法:tar zcvf test.tar.gz test [表示把文件夹目录压缩成test.tar.gz文件保存] 解压方法:tar zxvf test.tar.gz –C /home [表示解压 ...

  3. CCF试题:高速公路(Targin)

    问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...

  4. hdu 1428(很好的一道题,最短路+记忆化搜索)

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. BootstrapTable与KnockoutJS相结合实现增删改查功能

    http://www.jb51.net/article/83910.htm KnockoutJS是一个JavaScript实现的MVVM框架.通过本文给大家介绍BootstrapTable与Knock ...

  6. 深入解析php中的foreach问题

    本篇文章是对php中的foreach问题进行了详细的分析介绍,需要的朋友参考下   前言:php4中引入了foreach结构,这是一种遍历数组的简单方式.相比传统的for循环,foreach能够更加便 ...

  7. 《深入理解Android2》读书笔记(七)

    接上篇<深入理解Android2>读书笔记(六) 广播接受者 注册 ContextImpl @Override public Intent registerReceiver(Broadca ...

  8. 《深入理解Android2》读书笔记(二)

    接之前那篇<深入理解Android2>读书笔记(一) 下面几篇来分别详细分析 Binder类作为服务端的Bn的代表,BinderProxy类作为客户端的Bp的代表,BinderIntern ...

  9. Implement Trie(LintCode)

    Implement Trie Implement a trie with insert, search, and startsWith methods. 样例   注意 You may assume ...

  10. 训练continue

    11.16 树状数组 http://codeforces.com/contest/1070/problem/C digit sum+% dp http://codeforces.com/contest ...