ASP.NET Web API 开篇示例介绍

ASP.NET Web API

对于我这个初学者来说ASP.NET Web API这个框架很陌生又熟悉着。

陌生的是ASP.NET Web API是一个全新的框架,对于这个框架在一个项目中起到的作用我暂且还不是很清楚这里也就不妄下结论了,说实话不是我不想而是我无能为力,只能自己去摸索试着去了解它。

熟悉的是ASP.NET Web API跟ASP.NET MVC的框架结构一开始看起来有一些相似的地方。

话就不多说了,大家就和我一起来学习ASP.NET Web API这个全新的框架吧。

ASP.NET Web API演示示例

环境基础配置

首先我们新建一个类库项目命名为Common,并且定义个货品信息类型,示例代码如下:

代码1-1

namespace Common
{
public class Product
{
public string ProductID { get; set; }
public string ProductName { get; set; }
public string ProductCategory { get; set; }
}
}

建立WebHost宿主环境

然后我们接着创建一个空的ASP.NET WEB应用程序命名为WebHost,这里说明一下ASP.NET Web API框架只是个独立框架,它并不能独立运行,所以它需要宿主环境,刚刚我们新建的WEB应用程序则会在下面的示例中暂时的承载着ASP.NET Web API框架来运行。

引用程序集

Newtonsoft.Json.dll 路径: C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Packages\Newtonsoft.Json.4.5.6\lib\net40Newtonsoft.Json.dll

System.Net.Http.dll 路径:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\ System.Net.Http.dll

System.Net.Http.Formatting.dll路径:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\ System.Net.Http.Formatting.dll

System.Web.Http.dll 路径:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\ System.Web.Http.dll

System.Web.Http.WebHost.dll路径:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Http.WebHost.dll

Common.dll (项目引用)

或者采用这种引用方式:

(如果上文中所述的目录位置没有Newtonsoft.Json.dll的话可以文件搜索一下,然后手动引用。)

随之我们再建立一个Web应用程序处理类Globl.asax ,并在其Application_Start()方法中注册路由,示例代码如下:

代码1-2

using System.Web.Http;

namespace WebHost
{
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
"DefaultAPI", "api/{controller}/{id}", new { controller="product",id = RouteParameter.Optional });
}
}
}

路由注册好了之后,我们还得新建个Web API控制器,命名为ProductController,示例代码如下:

代码1-3

using System.Web.Http;
using Common; namespace WebHost.Controllers
{
public class ProductController:ApiController
{
private static List<Product> products; static ProductController()
{
products = new List<Product>();
products.AddRange(
new Product[]
{
new Product(){ ProductID="", ProductName="牙刷",ProductCategory="洗漱用品"},
new Product(){ ProductID="", ProductName="《.NET框架设计—大型企业级应用框架设计艺术》", ProductCategory="书籍"}
});
} public IEnumerable<Product> Get(string id = null)
{
return from product in products where product.ProductID == id || string.IsNullOrEmpty(id) select product;
}
}
}

在代码1-3中我们看到ProductController控制器继承自ApiController,这里的方式我的猜想应该是跟ASP.NET MVC框架对控制器的处理一样,在请求到来之后并且经过路由处理之后,Web API框架会把当前项目中所有引用的程序集全部查找一下并且搜出继承自ApiController的类型,并且缓存在一个xml文件,不知道猜想的对不对在后面的篇幅我们再来验证,这里提一下。

细心的朋友的可能发现在路由注册的时候并没有对应的Action的路由参数,其实这里就是Web API框架的一个不同之处,它是根据Http请求方法来确定Action的方法的,然而浏览器默认的请求方法就是Http-get,所以我们这个时候可以直接运行项目。

图2

建立SelfHost

下面我们来看一下在SelfHost宿主环境中ASP.NET Web API框架的使用示例。

首先我们新建一个控制台应用程序命名为SelfHost,SelfHost环境项目的程序集引用和上面所说的WebHost项目引用唯一不同的就是把System.Web.Http.WebHost.dll程序集换成System.Web.Http.SelfHost.dll程序集,引用路径不变,也可以利用引用里的扩展栏来添加。

下面就让我们看一下在SelfHost中我们需要做哪些事,首先我们需要注册路由这是每次最先做的事情,示例代码如下:

代码1-4

using System.Web.Http;
using System.Web.Http.SelfHost; namespace SelfHost
{
class Program
{
static void Main(string[] args)
{
HttpSelfHostConfiguration selfHostConfiguration =
new HttpSelfHostConfiguration("http://localhost/selfhost");
using (HttpSelfHostServer selfHostServer = new HttpSelfHostServer(selfHostConfiguration))
{
selfHostServer.Configuration.Routes.MapHttpRoute(
"DefaultApi", "api/{controller}/{id}", new { id=RouteParameter.Optional}); selfHostServer.OpenAsync(); Console.WriteLine("服务器端服务监听已开启");
Console.Read();
}
}
}
}

这里就简要的说明一下,在1-4代码中HttpSelfHostConfiguration对象示例中设置了基地址,对于HttpSelfHostConfiguration类型它是继承自HttpConfiguration类型,HttpConfiguration类型是比较重要的一个类型,WebAPI框架中大多数的配置信息都在此类型实例中进行设置。在后续的篇幅中会有说到。

HttpSelfHostServer对象就是在SelfHost宿主环境中担当着很重要的角色,它负责处理请求等一系列操作(因为它是WebAPI框架在SelfHost环境中的管道模型的“龙头”),在这里只要稍作了解就行了,会在后面的管道篇幅揭开它的神秘面纱。

继续向下看我们会看到HttpSelfHostServer对象实例中的Configuration属性里的Routes属性提供了对路由的注册,这部分内容会在后面的路由篇幅讲解。

再之后就是我们看到的,打开服务监听,等待处理请求。(这里的监听/处理请求,并不是对真正的请求进行处理,而是对已经请求被封装好了的对象进行处理,管道篇幅中讲解)

在路由注册之后我们要新建个Web API控制器,就如同上面WebHost部分内容一样,拷贝一份过来,不过我们这里要对控制器的代码稍作修改,示例代码如下:

代码1-5

using System.Web.Http;
using Common; namespace SelfHost.Controllers
{
public class ProductController:ApiController
{
private static List<Product> products; static ProductController()
{
products = new List<Product>();
products.AddRange(
new Product[]
{
new Product(){ ProductID="", ProductName="牙刷",ProductCategory="洗漱用品"},
new Product(){ ProductID="", ProductName="《.NET框架设计—大型企业级应用框架设计艺术》", ProductCategory="书籍"}
});
} public IEnumerable<Product> Get(string id = null)
{
return from product in products where product.ProductID == id || string.IsNullOrEmpty(id) select product;
} public void Delete(string id)
{
products.Remove(products.First(product => product.ProductID == id));
} public void Post(Product product)
{
products.Add(product);
} public void Put(Product product)
{
Delete(product.ProductID);
Post(product);
}
}
}

对于在代码1-5中控制器新增的几个Action方法,也是分别对应着Http请求方法。这样也就是能实现增删改查的基础功能了。那我们还需要一个对它进行访问的客户端。

建立Clinet

我们再建一个控制台应用程序命名为Clinet,并且添加如下程序集引用:

Newtonsoft.Json.dll 路径: C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Packages\Newtonsoft.Json.4.5.6\lib\net40Newtonsoft.Json.dll

System.Net.Http.dll 路径:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\ System.Net.Http.dll

System.Net.Http.Formatting.dll路径:C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\ System.Net.Http.Formatting.dll

Common.dll (项目引用)

下面我们看一下在Client项目中对SelfHost环境中的资源进行访问的示例,示例代码如下:

代码1-6

using Common;
using System.Net.Http; namespace Client
{
class Program
{
static void Main(string[] args)
{
AsyncProcess();
Console.Read();
} private async static void AsyncProcess()
{
HttpClient httpClient = new HttpClient(); //获取货品信息列表
HttpResponseMessage responseMessage =
await httpClient.GetAsync("http://localhost/selfhost/api/product");
IEnumerable<Product> products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>();
OutputProductInfo(products); //添加货品
Product product = new Product()
{
ProductID = "",
ProductName = "《ASP.NET Web API 2 框架揭秘》",
ProductCategory = "食品类"
};
await httpClient.PostAsJsonAsync<Product>("http://localhost/selfhost/api/product", product);
responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product");
products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>();
OutputProductInfo(products); //修改指定货品信息
responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product/003");
product = (await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>()).First();
product.ProductCategory = "书籍";
await httpClient.PutAsJsonAsync<Product>("http://localhost/selfhost/api/product", product);
responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product");
products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>();
OutputProductInfo(products); //删除指定货品
await httpClient.DeleteAsync("http://localhost/selfhost/api/product/001");
responseMessage = await httpClient.GetAsync("http://localhost/selfhost/api/product");
products = await responseMessage.Content.ReadAsAsync<IEnumerable<Product>>();
OutputProductInfo(products); } private static void OutputProductInfo(IEnumerable<Product> products)
{
foreach (Product product in products)
{
Console.WriteLine(
"ProductID:{0},ProductName:{1},ProductCategorm:{2}",
product.ProductID, product.ProductName, product.ProductCategory);
}
Console.WriteLine("—————————————————————————");
}
}
}

对于代码1-5中出现诸多的类型会在后面的篇幅中一一的讲解,这里就不做阐述了,而是看一下我们最终的示例结果:

首先我们要运行SelfHost项目,等待界面和如下图3时,再行Client项目对SelfHost中的资源进行访问。结果如图4

图3

图4

参考资料: http://www.cnblogs.com/artech/p/web-api-sample.html

就是仿照蒋大书籍中的示例简化了一下做了一点调整,因为后面的篇幅中有用到这个示例。

这里吐槽一下起初国内对于Web API的书籍资料几乎没有,当然国外的有是有,不过都是英文版的。对于毫无英语基础的我等于是判了死缓,唯一的活路就是用翻译工具一点点的去看。

还好蒋大的新作出来了,不然想学Web API还真是无路可走。已看完前三章,收获颇多知识点很全面,在后面我学习到一些都会写出来跟大家分享。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

ASP.NET Web API 开篇示例介绍的更多相关文章

  1. ASP.NET Web API 路由对象介绍

    ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...

  2. C#版ASP.NET Web API使用示例

    为更好更快速的上手Webapi设计模式的接口开发,本文详细解释了在Web API接口的开发过程中,我们可能会碰到各种各样的问题总结了这篇,希望对大家有所帮助. 1:在接口定义中确定MVC的get或者P ...

  3. ASP.net Web API综合示例

    目录 概述 功能介绍 程序结构 服务器端介绍 客户端介绍 “契约” Web API设计规则 并行写入冲突与时间戳 身份验证详解 Web API验证规则 客户端MVVM简介 Web.Config 本DE ...

  4. ASP.NET Web API 入门示例详解

    REST服务已经成为最新的服务端开发趋势,ASP.NET Web API即为.NET平台的一种轻量级REST架构. ASP.NET Web API直接借鉴了ASP.NET MVC的设计,两者具有非常类 ...

  5. ASP.NET Web API使用示例

    原文地址:https://blog.csdn.net/chinacsharper/article/details/21333311 上篇博客讲解rest服务开发时,曾经提到过asp.net mvc中的 ...

  6. ASP.NET Web API 控制器创建过程(一)

    ASP.NET Web API 控制器创建过程(一) 前言 在前面对管道.路由有了基础的了解过后,本篇将带大家一起学习一下在ASP.NET Web API中控制器的创建过程,这过程分为几个部分下面的内 ...

  7. ASP.NET Web API WebHost宿主环境中管道、路由

    ASP.NET Web API WebHost宿主环境中管道.路由 前言 上篇中说到ASP.NET Web API框架在SelfHost环境中管道.路由的一个形态,本篇就来说明一下在WebHost环境 ...

  8. ASP.NET Web API Selfhost宿主环境中管道、路由

    ASP.NET Web API Selfhost宿主环境中管道.路由 前言 前面的几个篇幅对Web API中的路由和管道进行了简单的介绍并没有详细的去说明一些什么,然而ASP.NET Web API这 ...

  9. ASP.NET Web API 管道模型

    ASP.NET Web API 管道模型 前言 ASP.NET Web API是一个独立的框架,也有着自己的一套消息处理管道,不管是在WebHost宿主环境还是在SelfHost宿主环境请求和响应都是 ...

随机推荐

  1. Jenkins 安装的HTML Publisher Plugin 插件无法展示ant生成的JunitReport报告

    最近在做基于jenkins ant  junit 的测试持续集成,单独ant junit生成的junitreport报告打开正常,使用Jenkins的HTML Publisher Plugin 插件无 ...

  2. Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件

    Jquery Mobiscroll是一个用于触摸设备(Android phones, iPhone, iPad, Galaxy Tab)的日期和时间选择器jQuery插件.以及各种滑动插件 可以让用户 ...

  3. 神马玩意,EntityFramework Core 1.1又更新了?走,赶紧去围观

    前言 哦,不搞SQL了么,当然会继续,周末会继续更新,估计写完还得几十篇,但是我会坚持把SQL更新完毕,绝不会烂尾,后续很长一段时间没更新的话,不要想我,那说明我是学习新的技能去了,那就是学习英语,本 ...

  4. ASP.NET Core CORS 简单使用

    CORS 全称"跨域资源共享"(Cross-origin resource sharing). 跨域就是不同域之间进行数据访问,比如 a.sample.com 访问 b.sampl ...

  5. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  6. EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)

    前言 Entity Framework 延伸系列目录 今天我们来聊聊EF的日志记录. 一个好的数据库操作记录不仅仅可以帮你记录用户的操作, 更应该可以帮助你获得效率低下的语句来帮你提高运行效率 废话不 ...

  7. Quartz2D总结

    天了噜,脑子完全懵了,最起码说出来个上下文啊,连这个都给忘了,特此总结一下,并以此缅怀这次面试 Quartz2D的API来自于Core Graphics(这就是为什么CGContextRef是以CG开 ...

  8. 我的MYSQL学习心得(十四) 备份和恢复

    我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  9. MemoryMappedFile 在 Mono in Linux 的开发笔记

    前言 MemoryMappedFile(简称MMF)类是.NET中对内存映射文件进行操作的类,内存映射文件是非常高效的本地IO方案,由操作系统提供内存与IO文件之间的映射转换,对内存映射文件的更改由操 ...

  10. 使用 SecurityManager 和 Policy File 管理 Java 程序的权限

    参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentati ...