对于我这个初学者来说ASP.NET Web API这个框架很陌生又熟悉着。
陌生的是ASP.NET Web API是一个全新的框架,对于这个框架在一个项目中起到的作用我暂且还不是很清楚这里也就不妄下结论了,说实话不是我不想而是我无能为力,只能自己去摸索试着去了解它。
熟悉的是ASP.NET Web API跟ASP.NET MVC的框架结构一开始看起来有一些相似的地方。
话就不多说了,大家就和我一起来学习ASP.NET Web API这个全新的框架吧。
环境基础配置
首先我们新建一个类库项目命名为Common,并且定义个货品信息类型,示例代码如下:
代码1-1
1
2
3
4
5
6
7
8
9
<code>namespaceCommon</code>
<code>{</code>
<code> </code><code>publicclassProduct</code>
<code> </code><code>{</code>
<code> </code><code>publicstringProductID { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>publicstringProductName { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>publicstringProductCategory { </code><code>get</code><code>; </code><code>set</code><code>; }</code>
<code> </code><code>}</code>
<code>}</code>
建立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
10
11
12
13
<code>usingSystem.Web.Http;</code>
<code> </code>
<code>namespaceWebHost</code>
<code> </code><code>publicclassGlobal : System.Web.HttpApplication</code>
<code> </code><code>protectedvoidApplication_Start(objectsender, EventArgse)</code>
<code> </code><code>{</code>
<code> </code><code>GlobalConfiguration.Configuration.Routes.MapHttpRoute(</code>
<code> </code><code>"DefaultAPI"</code><code>, </code><code>"api/{controller}/{id}"</code><code>, </code><code>new</code> <code>{ controller=</code><code>"product"</code><code>,id=RouteParameter.Optional });</code>
<code> </code><code>}</code>
路由注册好了之后,我们还得新建个Web API控制器,命名为ProductController,示例代码如下:
代码1-3
14
15
16
17
18
19
20
21
22
23
24
25
26
<code>usingCommon;</code>
<code>namespaceWebHost.Controllers</code>
<code> </code><code>publicclassProductController:ApiController</code>
<code> </code><code>privatestaticList<Product>products;</code>
<code> </code><code>staticProductController()</code>
<code> </code><code>products=newList<Product>();</code>
<code> </code><code>products.AddRange(</code>
<code> </code><code>newProduct[] </code>
<code> </code><code>{</code>
<code> </code><code>newProduct(){ ProductID=</code><code>"001"</code><code>, ProductName=</code><code>"牙刷"</code><code>,ProductCategory=</code><code>"洗漱用品"</code><code>},</code>
<code> </code><code>newProduct(){ ProductID=</code><code>"002"</code><code>, ProductName=</code><code>"《.NET框架设计—大型企业级应用框架设计艺术》"</code><code>, ProductCategory=</code><code>"书籍"</code><code>}</code>
<code> </code><code>});</code>
<code> </code><code>publicIEnumerable<Product>Get(stringid=</code><code>null</code><code>)</code>
<code> </code><code>returnfromproductinproductswhereproduct.ProductID==id||</code><code>string</code><code>.IsNullOrEmpty(id) selectproduct;</code>
在代码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
<code>usingSystem.Web.Http.SelfHost;</code>
<code>namespaceSelfHost</code>
<code> </code><code>classProgram</code>
<code> </code><code>staticvoidMain(</code><code>string</code><code>[] args)</code>
<code> </code><code>HttpSelfHostConfigurationselfHostConfiguration=</code>
<code> </code><code>newHttpSelfHostConfiguration(</code><code>"http://localhost/selfhost"</code><code>);</code>
<code> </code><code>using</code> <code>(HttpSelfHostServerselfHostServer=newHttpSelfHostServer(selfHostConfiguration))</code>
<code> </code><code>{</code>
<code> </code><code>selfHostServer.Configuration.Routes.MapHttpRoute(</code>
<code> </code><code>"DefaultApi"</code><code>, </code><code>"api/{controller}/{id}"</code><code>, </code><code>new</code> <code>{ id=RouteParameter.Optional});</code>
<code> </code><code>selfHostServer.OpenAsync();</code>
<code> </code><code>Console.WriteLine(</code><code>"服务器端服务监听已开启"</code><code>);</code>
<code> </code><code>Console.Read();</code>
<code> </code><code>}</code>
这里就简要的说明一下,在1-4代码中HttpSelfHostConfiguration对象示例中设置了基地址,对于HttpSelfHostConfiguration类型它是继承自HttpConfiguration类型,HttpConfiguration类型是比较重要的一个类型,WebAPI框架中大多数的配置信息都在此类型实例中进行设置。在后续的篇幅中会有说到。
HttpSelfHostServer对象就是在SelfHost宿主环境中担当着很重要的角色,它负责处理请求等一系列操作(因为它是WebAPI框架在SelfHost环境中的管道模型的&ldquo;龙头&rdquo;),在这里只要稍作了解就行了,会在后面的管道篇幅揭开它的神秘面纱。
继续向下看我们会看到HttpSelfHostServer对象实例中的Configuration属性里的Routes属性提供了对路由的注册,这部分内容会在后面的路由篇幅讲解。
再之后就是我们看到的,打开服务监听,等待处理请求。(这里的监听/处理请求,并不是对真正的请求进行处理,而是对已经请求被封装好了的对象进行处理,管道篇幅中讲解)
在路由注册之后我们要新建个Web API控制器,就如同上面WebHost部分内容一样,拷贝一份过来,不过我们这里要对控制器的代码稍作修改,示例代码如下:
代码1-5
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<code>namespaceSelfHost.Controllers</code>
<code> </code><code>publicvoidDelete(stringid)</code>
<code> </code><code>products.Remove(products.First(product=>product.ProductID==id));</code>
<code> </code><code>publicvoidPost(Productproduct)</code>
<code> </code><code>products.Add(product);</code>
<code> </code><code>publicvoidPut(Productproduct)</code>
<code> </code><code>Delete(product.ProductID);</code>
<code> </code><code>Post(product);</code>
对于在代码1-5中控制器新增的几个Action方法,也是分别对应着Http请求方法。这样也就是能实现增删改查的基础功能了。那我们还需要一个对它进行访问的客户端。
建立Clinet
我们再建一个控制台应用程序命名为Clinet,并且添加如下程序集引用:
下面我们看一下在Client项目中对SelfHost环境中的资源进行访问的示例,示例代码如下:
代码1-6
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<code>usingSystem.Net.Http;</code>
<code>namespaceClient</code>
<code> </code><code>AsyncProcess();</code>
<code> </code><code>Console.Read();</code>
<code> </code><code>privateasyncstaticvoidAsyncProcess()</code>
<code> </code><code>HttpClienthttpClient=newHttpClient();</code>
<code> </code><code>//获取货品信息列表</code>
<code> </code><code>HttpResponseMessageresponseMessage=</code>
<code> </code><code>awaithttpClient.GetAsync(</code><code>"http://localhost/selfhost/api/product"</code><code>);</code>
<code> </code><code>IEnumerable<Product>products=awaitresponseMessage.Content.ReadAsAsync<IEnumerable<Product>>();</code>
<code> </code><code>OutputProductInfo(products);</code>
<code> </code><code>//添加货品</code>
<code> </code><code>Productproduct=newProduct()</code>
<code> </code><code>ProductID=</code><code>"003"</code><code>,</code>
<code> </code><code>ProductName=</code><code>"《ASP.NET Web API 2 框架揭秘》"</code><code>,</code>
<code> </code><code>ProductCategory=</code><code>"食品类"</code>
<code> </code><code>};</code>
<code> </code><code>awaithttpClient.PostAsJsonAsync<Product>(</code><code>"http://localhost/selfhost/api/product"</code><code>, product);</code>
<code> </code><code>responseMessage=awaithttpClient.GetAsync(</code><code>"http://localhost/selfhost/api/product"</code><code>);</code>
<code> </code><code>products=awaitresponseMessage.Content.ReadAsAsync<IEnumerable<Product>>();</code>
<code> </code><code>//修改指定货品信息</code>
<code> </code><code>responseMessage=awaithttpClient.GetAsync(</code><code>"http://localhost/selfhost/api/product/003"</code><code>);</code>
<code> </code><code>product= (awaitresponseMessage.Content.ReadAsAsync<IEnumerable<Product>>()).First();</code>
<code> </code><code>product.ProductCategory=</code><code>"书籍"</code><code>;</code>
<code> </code><code>awaithttpClient.PutAsJsonAsync<Product>(</code><code>"http://localhost/selfhost/api/product"</code><code>, product);</code>
<code> </code><code>//删除指定货品</code>
<code> </code><code>awaithttpClient.DeleteAsync(</code><code>"http://localhost/selfhost/api/product/001"</code><code>);</code>
<code> </code><code>privatestaticvoidOutputProductInfo(IEnumerable<Product>products)</code>
<code> </code><code>foreach</code> <code>(Productproductinproducts)</code>
<code> </code><code>Console.WriteLine(</code>
<code> </code><code>"ProductID:{0},ProductName:{1},ProductCategorm:{2}"</code><code>,</code>
<code> </code><code>product.ProductID, product.ProductName, product.ProductCategory);</code>
<code> </code><code>Console.WriteLine(</code><code>"—————————————————————————"</code><code>);</code>
对于代码1-5中出现诸多的类型会在后面的篇幅中一一的讲解,这里就不做阐述了,而是看一下我们最终的示例结果:
首先我们要运行SelfHost项目,等待界面和如下图3时,再行Client项目对SelfHost中的资源进行访问。结果如图4
图3
图4
就是仿照蒋大书籍中的示例简化了一下做了一点调整,因为后面的篇幅中有用到这个示例。
这里吐槽一下起初国内对于Web API的书籍资料几乎没有,当然国外的有是有,不过都是英文版的。对于毫无英语基础的我等于是判了死缓,唯一的活路就是用翻译工具一点点的去看。
还好蒋大的新作出来了,不然想学Web API还真是无路可走。已看完前三章,收获颇多知识点很全面,在后面我学习到一些都会写出来跟大家分享。
本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1534367,如需转载请自行联系原作者