于是有了让人晕头转向的配置、让人郁闷不已的调试,还有那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中添加如下代码:
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。代码如下:
namespace CNBlogsWebAPIDemo.Controllers{public class DemoController : APIController { }}
5. 添加viewmodels文件夹,在其中添加Site.cs,并定义Site。
namespace CNBlogsWebAPIDemo.viewmodels{public class Site {public int SiteID { get; set; }public string Title { get; set; }public string Uri { get; set; } }}
6. 给DemoController添加一个方法SiteList,并写上我们的示例代码。代码如下:
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:
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的感觉,代码如下:
var requestJson = JsonConvert.SerializeObject(new { startID = 1, itemcount = 3 });
代码的运行结果:{"startID":1,"itemcount":3}
然后用System.Net.http.StringContent把它打个包:
httpContent httpContent = new StringContent(requestJson);
然后设置一下ContentType:
httpContent.headers.ContentType = new MediaTypeheaderValue("application/Json");
4.4 通过http Post调用WebAPI得到返回结果
httpClIEnt闪亮登场,调用它的PostAsync()方法轻松搞定:
var httpClIEnt = new httpClIEnt();var responseJson = httpClIEnt.PostAsync("http://localhost:9000/API/demo/siteList", httpContent) .Result.Content.ReadAsstringAsync().Result;
看一下responseJson的结果:
[{"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又登场:
var sites = JsonConvert.DeserializeObject<IList<Site>>(responseJson);
展示一下返回结果:
代码
sites.ToList().ForEach(x => Console.Writeline(x.Title + ":" + x.Uri));
结果
博客园首页:www.cnblogs.com 博问:q.cnblogs.com 新闻:news.cnblogs.com
4.6 WebAPI_SiteList_test() 完整实现代码
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调用代码比较一下:
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的实例全部内容,希望文章能够帮你解决关于 *** 作 ASP.NET Web API的实例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)