WCF的野心造成了它的庞大复杂,HTTP的单纯造就了它的简单优美。为了实现分布式Web应用,我们不得不将两者凑合在一起 —— WCF服务以HTTP绑定宿主于IIS。

于是有了让人晕头转向的配置、让人郁闷不已的调试,还有那ServiceContract, DataContract, EnumMember...还有还有,不要在using语句中调用WCF服务...

于是经常自问:拿着牛刀削苹果有必要吗?废话,当然没有必要,水果刀在哪里?

微软看着这么多人拿着牛刀削苹果,自己也看不下去了,于是,一种水果刀横空出世 —— ASP.NET Web API。

最近我们在实际开发中有个地方用WCF太麻烦,就小试了一下水果刀,感觉还不错。

下面用一个简单的示例分享一下ASP.NET Web API水果刀的用法。

服务端ASP.NET Web API的实现

需要准备的工具:Visual Studio 2010, NuGet

1. 新建一个空的ASP.NET Web Application项目。

2. 通过NuGet添加ASP.NET Web API的引用,在NuGet中搜索时要用“AspNetWebApi”(用“ASP.NET Web API”是搜索不到的),然后选择ASP.NET Web API(Beta)进行安装。

3. 添加Global.asax,在Application_Start中注册Web API的路由,在Global.asax.cs中添加如下代码:

1
2
3
4
protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapHttpRoute("WebApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });
}

4. 添加Controllers文件夹,在其中添加类文件DemoController.cs,并让DemoController继承自ApiController。代码如下:

1
2
3
4
5
namespace CNBlogsWebApiDemo.Controllers
{public class DemoController : ApiController
    {
    }
}

5. 添加ViewModels文件夹,在其中添加Site.cs,并定义Site。

1
2
3
4
5
namespace CNBlogsWebApiDemo.ViewModels
{public class Site
    {public int SiteId { get; set; }public string Title { get; set; }public string Uri { get; set; }
    }
}

6. 给DemoController添加一个方法SiteList,并写上我们的示例代码。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
public class DemoController : ApiController
{public IList<Site> SiteList(int startId, int itemcount)
    {var sites = new List<Site>();
        sites.Add(new Site { SiteId = 1, Title = "test", Uri = "www.cnblogs.cc" });
        sites.Add(new Site { SiteId = 2, Title = "博客园首页", Uri = "www.cnblogs.com" });
        sites.Add(new Site { SiteId = 3, Title = "博问", Uri = "q.cnblogs.com" });
        sites.Add(new Site { SiteId = 4, Title = "新闻", Uri = "news.cnblogs.com" });
        sites.Add(new Site { SiteId = 5, Title = "招聘", Uri = "job.cnblogs.com" });var result = (from Site site in siteswhere site.SiteId > startIdselect site)
                        .Take(itemcount)
                        .ToList();return result;
    }
}

7. 配置一下Web项目的启动设置Specific Page与Specific port

8. Ctrl+F5运行项目,结果如下:

结果是我们期望的,用浏览器直接可以查看Web API的运行结果,测试时会很方便。

好了,服务端Web API就这么轻松搞定了!

客户端通过HttpClient调用服务端Web API

1. 新建一个WebApiTest的类库项目。

2. 在NuGet中添加System.Net.Http(HttpClient就在这里), Json.NET, xUnit.net。

3. 添加类文件WebApiClientTest.cs,添加测试方法WebApi_SiteList_Test:

1
2
3
4
5
6
7
8
9
namespace WebApiClientTest
{public class WebApiClientTest
    {
        [Fact]public void WebApi_SiteList_Test()
        {
        }
    }
}

4. WebApi_SiteList_Test() 的代码实现

4.1 首先,要确定三个东西:

  a) 客户端调用WebAPI的方式是Http Get,还Http Post,我们这里选用Http Post;

  b) 客户端调用WebAPI时传递的参数格式,我们这里选用的是Json。

  c) WebAPI返回的数据格式,我们这里选用的也是Json(这也是之前添加Json.NET引用的原因)。

4.2 用到的类

  • System.Net.Http.HttpClient

  • System.Net.Http.httpContent

  • System.Net.Http.StringContent

  • System.Net.Http.Headers.MediaTypeHeaderValue

  • Newtonsoft.Json.JsonConvert

4.3 准备需要传递给WebAPI的参数

  需要传递的两个参数是startId ,itemcount,传递的格式是Json。这里可没有Javascript中的JSON.stringify(),但我们有Json.NET,再加上匿名类型,有点用js的感觉,代码如下:

1
var requestJson = JsonConvert.SerializeObject(new { startId = 1, itemcount = 3 });

  代码的运行结果:{"startId":1,"itemcount":3}

  然后用System.Net.Http.StringContent把它打个包:

1
HttpContent httpContent = new StringContent(requestJson);

  然后设置一下ContentType:

1
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

4.4 通过Http Post调用WebAPI得到返回结果

  HttpClient闪亮登场,调用它的PostAsync()方法轻松搞定:

1
2
var httpClient = new HttpClient();var responseJson = httpClient.PostAsync("http://localhost:9000/api/demo/sitelist", httpContent)
    .Result.Content.ReadAsStringAsync().Result;

  看一下responseJson的结果:

1
[{"SiteId":2,"Title":"博客园首页","Uri":"www.cnblogs.com"},{"SiteId":3,"Title":"博问","Uri":"q.cnblogs.com"},{"SiteId":4,"Title":"新闻","Uri":"news.cnblogs.com"}]

  正宗的Json!你注意到没有,服务端WebAPI的代码未作任何修改,我们只是在Http Headers中将ContentType设置为了application/json,返回的就是Json格式的数据。而我们通过浏览器访问,得到的还是标准的XML。这里就是ASP.NET Web API的魅力之一 —— 一次实现,按需服务。

4.5 将Json格式返回的结果反序列化为强类型

  Json.NET又登场:

1
var sites = JsonConvert.DeserializeObject<IList<Site>>(responseJson);

  展示一下返回结果:

  代码

1
sites.ToList().ForEach(x => Console.WriteLine(x.Title + ":" + x.Uri));

  结果  

1
2
3
博客园首页:www.cnblogs.com
博问:q.cnblogs.com
新闻:news.cnblogs.com

4.6 WebApi_SiteList_Test() 完整实现代码

1
2
3
4
5
6
7
8
9
10
11
12
public class WebApiClientTest
{
    [Fact]public void WebApi_SiteList_Test()
    {            var requestJson = JsonConvert.SerializeObject(new { startId = 1, itemcount = 3 });
        HttpContent httpContent = new StringContent(requestJson);
        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");var httpClient = new HttpClient();var responseJson = httpClient.PostAsync("http://localhost:9000/api/demo/sitelist", httpContent)
            .Result.Content.ReadAsStringAsync().Result;var sites = JsonConvert.DeserializeObject<IList<Site>>(responseJson);
        sites.ToList().ForEach(x => Console.WriteLine(x.Title + ":" + x.Uri));
    }
}

注:运行这里的代码之前,要先运行WebAPI项目,先把服务跑起来,客户端才能享受到服务。

与jQuery ajax调用代码比较一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
var requestJson = JSON.stringify({ startId: 1, itemcount: 3 });
$.ajax({
    url: '/api/demo/sitelist',
    data: requestJson,
    type: "post",
    dataType: "json",
    contentType: "application/json; charset=utf8",
    success: function (data) {
        jQuery.each(data, function (i, val) {
            $("#result").append(val.Title + ': ' + val.Uri +'<br/>');
        });
    }
});

注:上面的代码是可真实运行的哦,代码在示例代码WebApiDemo项目的AjaxWebApi.htm文件中。这也是ASP.NET Web API “一次实现,按需服务”的体现。

小结

水果刀(ASP.NET Web API)用下来感觉还不错,不仅可以削苹果,还可以削梨子,切西瓜也不在话下。用不用牛刀(WCF),还得多考虑考虑。

以上就是关于操作 ASP.NET Web API的实例的详细内容,更多请关注php中文网其它相关文章!

关于操作 ASP.NET Web API的实例相关推荐

  1. ASP.NET Web API自身对CORS的支持:从实例开始

    在<通过扩展让ASP.NET Web API支持W3C的CORS规范>中我们通过自定义的HttpMessageHandler为ASP.NET Web API赋予了跨域资源共享的能力,具体来 ...

  2. ASP.NET MVC (四、ASP.NET Web API应用程序与跨域操作)

    目录 前言: 1.创建MVC项目 2.修改返回格式 3.创建[Web API]控制器 4.创建[HttpGet]访问接口 5.创建[HttpPost]访问接口 6.测试接口: 6.1.执行:点击[调试 ...

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

    前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了一些微小的修改,这也是根据每个框架的特性来制定 ...

  4. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

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

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

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

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

  7. ASP.NET Web API Model-ModelBinder

    ASP.NET Web API Model-ModelBinder 前言 本篇中会为大家介绍在ASP.NET Web API中ModelBinder的绑定原理以及涉及到的一些对象模型,还有简单的Mod ...

  8. 【ASP.NET Web API教程】2.3.3 创建Admin控制器

    原文:[ASP.NET Web API教程]2.3.3 创建Admin控制器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 3 ...

  9. ASP.NET Web API 基本操作(CRUD)

    上一篇介绍了ASP.NET Web API的基本知识和原理,这一篇我们通过一个更直观的实例,对产品进行CRUD操作(Create/Read/Update/Delete)来继续了解一下它的基本应用. 创 ...

最新文章

  1. bzoj2243 [SDOI2011]染色
  2. 解密回声消除技术之一(理论篇)
  3. Installing python 2.7 on centos 6.3.
  4. HTML5能为我们带来什么?(一)
  5. ABAP Text table implementation
  6. [导入]C#实现Des加密和解密
  7. mysql导入社工库文件_社工库-数据表结构设计和数据导入
  8. vcglib中面自相交的检测算法
  9. 怎么把AI文件导入到PS里面
  10. Java运行环境的配置
  11. word,excel转pdf
  12. 中望3D2022弹簧的设计
  13. 常见的数据结构及其特征
  14. 了解一下银行科技信息岗
  15. java 软件流程图使用什么_流程图怎么画,教你正确使用流程图模板
  16. 计算机管理guest用户在哪,电脑来宾账户权限设置怎么设置
  17. Python到底该怎么学
  18. 第4-8课:方块消除游戏
  19. FPGA第一天的学习-LED流水灯
  20. 每日一滴(实践)——NLP之处理停用词

热门文章

  1. 使用 Redis的SETNX命令实现分布式锁
  2. ./configure --prefix
  3. Redis集群模式搭建
  4. 天津科技大学中外合作办学计算机科学怎么样,天津科技大学计算机类(中外合作办学)(计算机科学与技术(信息处理专业2016年在安徽理科高考录取最低分数线...
  5. 查看Linux版本系统信息方法汇总
  6. 生产环境Go程序内存泄露,用pprof如何快速定位
  7. 微服务难点剖析 | 服务拆的挺爽,问题是日志该怎么串联起来呢?
  8. Zookeeper之session的基本原理
  9. java使用netty
  10. time和datatime模块