不管是因为什么原因,结果是在新出的MVC中,增加了WebAPI,用于提供REST风格的WebService,个人比较喜欢REST风格的WebService,感觉比SOAP要轻量级一些,而且对客户端的要求也更少,更符合网络数据传输的一般模式,客户端完全摆脱了代理和管道来直接和WebService进行交互,具体的区别可以参见Web
服务编程,REST 与 SOAP
(一)环境准备
本机的环境是XP+VS2010,需要安装VS2010 SP1升级包,MVC4升级包,Vs2010安装SP1后会影响SQLServer2008的自动提示功能,需要在安装补丁或插件,安装成功后可以新建如下的 MVC WebAPI 项目
(二)概览
新生成的WebAPI项目和典型的MVC项目一样,包含主要的Models,Views,Controllers等文件夹和Global.asax文件
Views对于WebAPI来说没有太大的用途,Models中的Model主要用于保存Service和Client交互的对象,这些对象默认情况下会被转换为Json格式的数据进行传输,Controllers中的Controller对应于WebService来说是一个Resource,用于提供服务。和普通的MVC一样,Global.asax用于配置路由规则
(三)Models
和WCF中的数据契约形成鲜明对比的是,MVC WebAPI中的Model就是简单的POCO,没有任何别的东西,如,你可以创建如下的Model
public class TestUseMode
{
public string ModeKey{get;set;}
public string ModeValue { get; set; }
}
注意:Model必须提供public的属性,用于json或xml反序列化时的赋值
(四)Controllers
MVC WebAPI中的Controllers和普通MVC的Controllers类似,不过不再继承于Controller,而改为继承API的ApiController,一个Controller可以包含多个Action,这些Action响应请求的方法与Global中配置的路由规则有关,在后面结束Global时统一说明
(五)Global
默认情况下,模板自带了两个路由规则,分别对应于WebAPI和普通MVC的Web请求,默认的WebAPI路由规则如下
1 routes.MapHttpRoute(
2 name: "DefaultApi",
3 routeTemplate: "api/{controller}/{id}",
4 defaults: new { id = RouteParameter.Optional }
5 );
可以看到,默认路由使用的固定的api作为Uri的先导,按照微软官方的说法,用于区分普通Web请求和WebService的请求路径:
Note:The reason for using "api" in the route is to avoid collisions with ASP.NET MVC routing. That way, you can have "/contacts" go to an MVC controller,
and "/api/contacts" go to a Web API controller. Of course, if you don't like this convention, you can change the default route table.
可以看到,默认的路由规则只指向了Controller,没有指向具体的Action,因为默认情况下,对于Controller中的Action的匹配是和Action的方法名相关联的:
具体来说,如果使用上面的路由规则,对应下面的Controller:
public class TestController : ApiController
{
public static List<TestUseMode> allModeList = new List<TestUseMode>();
public IEnumerable<TestUseMode> GetAll()
{
return allModeList;
}
public IEnumerable<TestUseMode> GetOne(string key)
{
return allModeList.FindAll((mode) => { if (mode.ModeKey.Equals(key)) return true; return false; });
}
public bool PostNew(TestUseMode mode)
{
allModeList.Add(mode);
return true;
}
public int Delete(string key)
{
return allModeList.RemoveAll((mode) => { if (mode.ModeKey == key) return true; return false; });
}
public int DeleteAll()
{
return allModeList.RemoveAll((mode) => { return true; });
}
public int PutOne(string key, string value)
{
List<TestUseMode> upDataList = allModeList.FindAll((mode) => { if (mode.ModeKey == key) return true; return false; });
foreach(var mode in upDataList)
{
mode.ModeValue = value;
}
return upDataList.Count;
}
}
则,会有下面的对应关系:
简单使用JS调用上面提供的数据接口
1 function getAll() {
2 $.ajax({
3 url: "api/Test/",
4 type: 'GET',
5 success: function (data) {
6 document.getElementById("modes").innerHTML = "";
7 $.each(data, function (key, val) {
8 var str = val.ModeKey + ': ' + val.ModeValue;
9 $('<li/>', { html: str }).appendTo($('#modes'));
10 });
11 }
12 }).fail(
13 function (xhr, textStatus, err) {
14 alert('Error: ' + err);
15 });
16 }
17
18
19
20 function add() {
21
22 $.ajax({
23 url: "api/Test/",
24 type: "POST",
25 dataType: "json",
26 data: { "ModeKey": document.getElementById("txtKey").value, "ModeValue": document.getElementById("txtValue").value },
27 success: function (data) {
28 getAll();
29 }
30 }).fail(
31 function (xhr, textStatus, err) {
32 alert('Error: ' + err);
33 });
34
35 }
36
37 function find() {
38
39 $.ajax({
40 url: "api/Test/" + document.getElementById("txtFindKey").value,
41 type: 'GET',
42 success: function (data) {
43 document.getElementById("modes").innerHTML = "";
44 $.each(data, function (key, val) {
45 var str = val.ModeKey + ': ' + val.ModeValue;
46 $('<li/>', { html: str }).appendTo($('#modes'));
47 });
48 }
49 }).fail(
50 function (xhr, textStatus, err) {
51 alert('Error: ' + err);
52 });
53 }
54
55 function removeAll() {
56 $.ajax({
57 url: "api/Test/",
58 type: 'DELETE',
59 success: function (data) {
60 document.getElementById("modes").innerHTML = "";
61 getAll();
62 }
63 }).fail(
64 function (xhr, textStatus, err) {
65 alert('Error: ' + err);
66 });
67 }
68
69 function remove() {
70 $.ajax({
71 url: "api/Test/"+document.getElementById("txtRemoveKey").value,
72 type: 'DELETE',
73 success: function (data) {
74 document.getElementById("modes").innerHTML = "";
75 getAll();
76 }
77 }).fail(
78 function (xhr, textStatus, err) {
79 alert('Error: ' + err);
80 });
81 }
82
83 function update() {
84 $.ajax({
85 url: "api/Test/",
86 type: 'PUT',
87 dataType: "json",
88 data: { "key": document.getElementById("txtUpdateKey").value, "value": document.getElementById("txtUpdateValue").value },
89 success: function (data) {
90 document.getElementById("modes").innerHTML = "";
91 getAll();
92 }
93 }).fail(
94 function (xhr, textStatus, err) {
95 alert('Error: ' + err);
96 });
97 }
这样就实现了最基本的CRUD操作。
(六)路由规则扩展
和普通的MVC一样,MVC WebAPI支持自定义的路由规则,如:在上面的操作中,路由规则使用
则限定了使用GET方式利用URL来传值时,controller后面的接收参数名为id,但是在Controller中,GetOne方法的接收参数名为key,是不会被匹配的,这是只需要新增一个新的路由规则,或修改原先的路由规则为:
当然,可以对路由进行更深的扩展,如:扩展成和普通MVC一样的路由:
"api/{controller}/{action}/{id}"
这样,就要求同时使用Action和HTTP方法进行匹配
当然,根据微软的说法,这种使用是不被推荐的,因为这不符合大家对WebService的一般认知:
For a RESTful API, you should avoid using verbs in the URIs, because a URI should identify a resource, not an action.
(七)使用Attribute声明HTTP方法
有没有感觉默认的使用方法名来匹配HTTP Method的做法很傻??或者我有一些方法是自己用的,不想暴露出来,又该怎么办?还是使用attribute做这些工作感觉优雅一些,比如,上面的Action我可以更改为:
[HttpGet]
public IEnumerable<TestUseMode> FindAll()
[HttpGet]
public IEnumerable<TestUseMode> FindByKey(string key)
[HttpPost]
public bool Add(TestUseMode mode)
[HttpDelete]
public int RemoveByKey(string key)
[HttpDelete]
public int RemoveAll()
[HttpPut]
public int UpdateByKey(string key, string value)
[NonAction]
public string GetPrivateData()
当然,我只列出了方法名,而不是这些方法真的没有方法体...方法体是不变的,NoAction表示这个方法是不接收请求的,即使以GET开头。
如果感觉常规的GET,POST,DELETE,PUT不够用,还可以使用AcceptVerbs的方式来声明HTTP方法,如:
[AcceptVerbs("MKCOL", "HEAD")]
public int UpdateByKey(string key, string value)
{
List<TestUseMode> upDataList = allModeList.FindAll((mode) => { if (mode.ModeKey == key) return true; return false; });
foreach(var mode in upDataList)
{
mode.ModeValue = value;
}
return upDataList.Count;
}
******************************************************************************
分享到:
相关推荐
ASP.NET MVC4 Web API是微软开发的一个用于构建RESTful服务的框架,与ASP.NET MVC共享许多概念和结构,但专门针对HTTP服务设计。在Visual Studio 2013环境下,开发者可以利用其强大的工具集来高效地创建和管理API...
综上所述,"ASP.NET MVC4 WebApi ProductsApp"是一个使用ASP.NET MVC4和WebAPI技术构建的示例应用,旨在教授如何创建一个RESTful API来处理产品管理任务。通过Visual Studio 2012,开发者可以便捷地开发、测试和部署...
MVC webapi+autofac实现IOC的依赖注入,大多数讲的是MVC WEB 的依赖注入,网上都是只言片语或者零星的代码段,想学习的 MVC webapi+autofac实现IOC的依赖注入的同学们,此demo或许是您比较好的一个选择哦。
在本案例“mvc后台调用webapi接口”中,我们将探讨如何在MVC应用中调用WebAPI接口来实现数据交互。 WebAPI是.NET Framework的一部分,它允许开发者创建RESTful服务。REST(Representational State Transfer)是一种...
本项目结合了VS2019、MVC(Model-View-Controller)、WebAPI以及ActiveX控件,旨在创建一个能够处理文件上传与下载,且能在特定条件下调用COM组件的Web应用。以下将详细介绍这些技术及其应用。 1. **VS2019**:...
这个“MVC+WebAPI跨域调用.rar”压缩包文件提供了一个简单的示例,用于演示如何使用jQuery在MVC(Model-View-Controller)框架下调用WebAPI实现跨域通信。 **什么是MVC模式?** MVC是一种流行的设计模式,广泛应用...
WebApi跨域访问是Web开发中的一个重要话题,尤其是在ASP.NET MVC4框架下,因为WebApi经常作为服务端接口,为各种客户端(包括HTML5页面)提供数据。在现代Web应用程序中,由于同源策略的限制,JavaScript代码通常...
1.使用.net Framework 4.5实现的webApi接口。 2. http get 请求,json格式返回 。 3.请求格式为:http://192.168.10.100/ParkApi/Index 4.返回格式为:{"code":1,"msg":"success"}
在本文中,我们将深入探讨如何使用AngularJS、ASP.NET MVC、Web API和Entity Framework(EF)构建一个完整的多层Single Page Application(SPA)。这个技术栈是现代Web开发中常用的一组工具,它们协同工作,可以提供...
ASP.NET MVC 4 Web API 是一个强大的框架,用于构建RESTful服务,它可以处理各种类型的数据交换,包括文件上传。在Web API中实现文件上传功能,能够使得客户端应用程序(如Web应用、移动应用或桌面应用)能够方便地...
WebAPI Demo MVC4是一个示例项目,展示了如何在ASP.NET MVC4框架下使用WebAPI进行数据交互,并结合Knockout.js实现客户端的数据绑定和界面更新。这个项目是使用Visual Studio 2013开发的,涵盖了从数据的增、删、改...
ASP.NET MVC4是一种基于微软.NET Framework的开源web应用程序框架,专为构建可维护性和测试性的动态网站而设计。它结合了MVC(Model-View-Controller)设计模式、ASP.NET的功能性和HTML5的新特性,提供了高效且灵活...
C#_MVC_WEB.API的简单DEMO,灵感来自于网络,添加了测试用例,注释详尽,一看就会。解压可用,有数据库文件和建库脚本。推荐API调试工具SoapUI。我的腾讯微博:http://t.qq.com/djk8888
在这个项目中,WebAPI作为MVC之外的另一个接口层,提供了与数据库交互的API。例如,你可以创建一个`StudentsController`,其中包含处理GET、POST、PUT和DELETE请求的方法,以支持CRUD操作。 ```csharp public class...
在.NET MVC框架中,开发人员经常需要通过WebApi接口处理文件上传操作,这在Web应用程序中是常见的功能,尤其在用户需要提交表单或者分享数据时。本篇将详细讲解如何在.NET MVC应用中调用WebApi接口实现文件上传。 ...
ASP.NET MVC4 WebAPI是微软开发的一个用于构建RESTful服务的框架,它是ASP.NET MVC框架的一部分,主要用于构建HTTP服务,可以被任何类型的客户端,包括浏览器和移动设备所调用。在"asp .net mvc4 webapi(增、删、改...
标题中的“基于DDD与AdminLteBootStrap搭建的MVC与WebApi基础框架”指出,这个项目是使用领域驱动设计(DDD)、AdminLTE和Bootstrap技术构建的一个基础框架,适用于MVC(Model-View-Controller)模式的Web应用程序...
总的来说,".NET MVC + ZTree + WebAPI本地文件遍历查询系统"是一个综合运用了多种技术的Web应用,它利用.NET MVC处理Web交互,ZTree提供友好的前端展示,WebAPI作为数据接口,实现了本地文件系统的高效查询和遍历。...
“MvcApp”可能是一个示例项目,演示了如何使用ASP.NET MVC4和WebAPI创建实际的应用。通过这个项目,我们可以看到如何配置路由,如何定义控制器和模型,以及如何创建视图。它还可能展示了如何集成其他ASP.NET功能,...