1. WebApi和MVC有什么区别
首先要重点说的是,Web API是一种无限接近于RESTful风格的轻型框架,且不是微软提出来的,微软在.NET上实现了这中框架—Asp.Net Web API,所以“微软包装”是一个极大的偏见。
就应用市场时间而论,MVC普及市场的时间比Web API时间早。为什么MVC提出来了,且都被大家公认是一种经典的web站点实现架构,为什么还要搞Web API呢?
这两年什么炒得最火热?互联网。在网络技术不断更新和替代的过程,网络不断普及。互联网产品只要你有技术,就可以做。但要说明的是,互联网产品的用户不再是一小部分人群,除了潜在用户,你需要面对的是庞大的上网人群和开发者。这时候你要考虑你的WEB服务器是否能够支持这么多的用户,节省一点点传输数据的带宽都能够让你的服务器轻松不少,除此之外,你还要考虑你的潜在用户变成你的真实用户的某刻时刻,你的服务器是否能够顺利支撑。
面对用户,你要考虑你的产品是否能够让用户使用起来感觉很“爽”,你要把用户体验放在首位,那么你的产品首先功能上必须稳定,不然即使有再好的创意,再耐心的用户总会使用其它产品替代你的产品。
面对开发者,你想要把某些功能开放,这时候你必须要开放某些接口。有人会说,我也可以使用MVC来开放这些接口,没错是可以,但是绕远道给你带来的是更大的代价。
Web API 和 MVC可以说是两个不同的东西。Web API更倾向于基于HTTP协议的服务,直接返回用户的数据请求。MVC是建站的一种框架,倾向于返回用户的页面请求。
我总结了以下 ASP.NET Web API 的特性,更能说明Web API是一种数据请求框架:
ASP.NET Web API 可以根据请求报文来返回的相应数据格式。包括JSON和XML。
ASP.NET Web API 单独做数据请求和MVC做页面请求可以让Web前端和后台更好的解耦,减少开发难度。
Web API 可以更好地用在移动端网页、桌面端网页或者桌面程序。
Web API 的宿主可以选择多样:WebHost,,ConsoleHost,甚至是windows Services。
类似可以理解成ashx和webform的区别
2. 创建C#的wpf项目(C/S架构),不知道C/S架构中能不能用webapi,请高人解答,谢谢!
首先 ,你要明白浏览器也是客户端,只不过他提供的是一套通用的解释方式,具体执行程序放在了服务器上,服务器应用跟本地应用,本质上无差异,基本都是Sever+客户端处理,WPF是可以调用web api的 sever收到http请求可不管你是谁 是什么样的客户端发来的 只要是正确的http请求 就能响应,
3. MVC WebApi在调试开发下访问正常,部署到服务器访问不到接口
1、服务器是否正常启动(查看日志)
2、服务器的IP+PORT是否可以访问,查看端口是否被占用
3、若服务正常启动,端口也可以访问,查看你的访问路径是否正确(部署后的上下文webcontent是否与调试中一致)
4、访问不到有很多原因,要看你面对的具体问题去排查,比如报错信息之类~
4. c#mvc中的webapi怎么迫使服务端返回字符串
返回值是string就好了。
publicstringGet(intid)
{
return"字符串";
}
用AJAX取json格式的就是这样的。
5. WebApi 2 路由机制
.net中包含的路由有两种,第一种是MVC模式的按url匹配action,第二种是WebApi模式的按http请求的方法匹配action,本文我们学习WebApi的路由模式。
首先新建一个WebApi项目,选择ASP.NET Web应用程序(.NET Framework)
这里我们首先来看WebApi的基础配置 WebApiConfig.cs ,其路径为 /App_Start/WebApiConfig.cs
首先以浏览器启动webapi项目
会发现页面显示403,这是很正常的,因为我们在新建项目的时候没有加入MVC,所以没有可视化的view页面,不过我们却拿到了这个项目的 端口号
为了更加方便直观的看我们的接口请求,我们选择postman,首先在项目新建一个 controller
通过以上的操作,我们就搭建好了一个webApi2的项目工程,后面我们就在这个工程的基础上进行webApi 2的开发和学习。
webApi的路由过程主要经历了如下三步
WebApiConfig.cs 这个文件是进行路由表的核心文件, WebApiConfig 里面只有一个方法,这个方法在 Global.asax 文件里的 Application_Start() 方法被调用, Global.asax 文件是一个全局文件,当我们网页启动时就会去执行它。 Register(HttpConfiguration config) 方法是配置WEB API路由的。
因此 在webAP工程启动的时候,会执行 Global.asax ,这个文件里面注册了 WebApiConfig.cs 的一系列初始化配置,从而实现了webapi。
WebApi 2 框架使用路由表。 并由Web API 的 Visual Studio 项目模板创建默认路由
转到 MapHttpRoute 的定义,可以看到它有4个重载
分别来看看各个参数的作用
webApi2工程自动为我们创建了默认的路由
经过上面的讲解,我们知道了匹配的URL是 api/{controller}/{id}
那么我们在实际的请求中应该如何请求
新建一个 StudentsController
依次对以下地址进行请求
总结:
默认路由的缺点
如下
添加如下的方法(action)
得到了一下的结果
我们来看看这个请求是如何进行匹配的,首先找到 /App_Start/WebApiConfig.cs
按照路由模板来看,我们请求的路由没有 action 名称,那么它是怎么进行匹配的呢?
其实当我们访问 http://localhost:65066/api/student 这个url的时候,webapi会自动去匹配 api/{controller}/{id} 这个模板,在这个路径中,student是controller,那么它又是怎么去找到 getStudentName 这个action的呢?明明我们都没有传action这个参数,其实Webapi的路由规则是通过http方法去匹配对应的action,我们请求这个地址是用的 GET 方法,那么webapi会找Order这个控制器里面的get请求的方法,同事我们的这个 getStudentName 是以 get 开头的,它符合了webapi的匹配规则,于是就请求成功了,但前提是你写的方法必须是以get开头的,如果当前这个controller一个get开头的都没有,那么就显示 请求的资源不支持 http 方法“GET” 。
当然不以get开头的前提是你必须加上 [HttpGet] 这个特性,webapi才知道你这个是get的请求方法,就能正确进行匹配。
然后我们再回到 /App_Start/WebApiConfig.cs ,看下里面 MapHttpRoute 的各个参数的含义,首先转到它的定义,发现它是 HttpRouteCollection 的扩展方法, MapHttpRoute 有4类重载
在 WebApiConfig.cs 里面修改为如下的路由模板
接口请求如下
通过 action 的名称来匹配很好理解,上面的 StudentName() 是方法名, webApi 会默认它就是 action 的名称,如果你想要方法名和 action 的名称不一致,你也可以自定义 action 的名称,这个可以通过特性 ActionName 来实现,如下:
首先看路由模板
对于同请求类型,同请求参数的请求,会出现 不传参数,找不到匹配的资源 或 传了参数,但是找到了与该请求匹配的多个操作 的问题,如下所示
解决以上的办法有两种
如果要使用特性路由,首先在 WebApiConfig.cs 的 Register 方法里面必须先启用特性路由(一般情况下,当我们新建一个 WebApi 项目的时候,会自动在 Register 方法里面加上这句话。)
特性路由的目的是为了解决我们公共路由模板引擎解决不了的问题。一个action定义了特性路由之后,就能通过特性路由上面的路由规则找到。
只要出现了特性路由,匹配的规则是按特性路由来的
修改studentController如下
参考
参考
路由前缀的一般的做法是在控制器上面使用特性 [RoutePrefix] 来标识。
但是需要注意路由前缀不能以 / 开头
6. asp.net mvc3 项目怎么开发API接口
Visual Studio为我们提供了专门用于创建ASP.NET Web API应用的项目模板,借助于此项目模板提供的向导,我们可以“一键式”创建一个完整的ASP.NET Web API项目。在项目创建过程中,Visual Studio会自动为我们添加必要的程序集引用和配置,甚至会为我们自动生成相关的代码,总之一句话:这种通过向导生成的项目在被创建之后其本身就是一个可执行的应用。
对于IDE提供的这种旨在提高生产效率的自动化机制,我个人自然是推崇的,但是我更推荐读者朋友们去了解一下这些自动化机制具体为我们做了什么?做这些的目的何在?哪些是必需的,哪些又是不必要的?正是基于这样的目的,在接下来演示的实例中,我们将摒弃Visual Studio为我们提供的向导,完全在创建的空项目中编写我们的程序。这些空项目体现在如右图所示的解决方案结构中。
如右图所示,整个解决方案一共包含6个项目,上面介绍的作为“联系人管理器”的单页Web应用对应着项目WebApp,下面的列表给出了包括它在内的所有项目的类型和扮演的角色。
·Common:这是一个空的类库项目,仅仅定义了表示联系人的数据类型而已。之所以将数据类型定义在独立的项目中,只要是考虑到它会被多个项目(WebApi和ConsoleApp)所使用。
WebApi:这是一个空的类库项目,表现为HttpController类型的Web API就定义在此项目中,它具有对Common的项目引用。
WebHost:这是一个空的ASP.NET Web应用,它实现了针对ASP.NET Web API的Web Host寄宿,该项目具有针对WebApi的项目引用。
SelfHost:这是一个空的控制台应用,旨在模拟ASP.NET Web API的Self Host寄宿模式,它同样具有针对WebApi的项目引用。
WebApp:这是一个空的ASP.NET Web应用,代表“联系人管理器”的网页就存在于该项目之中,至于具体的联系人管理功能,自然通过以Ajax的形式调用Web API来完成。
ConsoleApp:这是一个空的控制台应用,我们用它来模拟如何利用客户端代理来实现对Web API的远程调用,它具有针对Common的项目引用。
二、定义Web API
在正式定义Web API之前,我们需要在项目Common中定义代表联系人的数据类型Contact。简单起见,我们仅仅为Contact定义了如下几个简单的属性,它们分别代表联系人的ID、姓名、联系电话、电子邮箱和联系地址。
1: public class Contact
2: {
3: public string Id { get; set; }
4: public string Name { get; set; }
5: public string PhoneNo { get; set; }
6: public string EmailAddress { get; set; }
7: public string Address { get; set; }
8: }
表现为HttpController的Web API定义在WebApi项目之中,我们一般将ApiController作为继承的基类。ApiController定义在“System.Web.Http.dll”程序集中,我们可以在目录“%ProgramFiles%\Microsoft ASP.NET\ASP.NET Web Stack 5\Packages\”中找到这个程序集。具体来说,该程序集存在于子目录“Microsoft.AspNet.WebApi.Core.5.0.0\lib\net45”中。
Web API体现在如下所示的ContactsController类型中。在该类型中,我们定义了Get、Post、Put和Delete这4个Action方法,它们分别实现了针对联系人的查询、添加、修改和删除操作。Action方法Get具有一个表示联系人ID的可缺省参数,如果该参数存在则返回对应的联系人,否则返回整个联系人列表。由于ASP.NET Web API默认实现了Action方法与HTTP方法的映射,所以方法名也体现了它们各自所能处理请求必须采用的HTTP方法。
1: public class ContactsController: ApiController
2: {
3: static List<Contact> contacts;
4: static int counter = 2;
5:
6: static ContactsController()
7: {
8: contacts = new List<Contact>();
9: contacts.Add(new Contact { Id = "001", Name = "张三",
10: PhoneNo = "0512-12345678", EmailAddress = "[email protected]",
11: Address = "江苏省苏州市星湖街328号" });
12: contacts.Add(new Contact { Id = "002", Name = "李四",
13: PhoneNo = "0512-23456789", EmailAddress = "[email protected]",
14: Address = "江苏省苏州市金鸡湖大道328号" });
15: }
16:
17: public IEnumerable<Contact> Get(string id = null)
18: {
19: return from contact in contacts
20: where contact.Id == id || string.IsNullOrEmpty(id)
21: select contact;
22: }
23:
24: public void Post(Contact contact)
25: {
26: Interlocked.Increment(ref counter);
27: contact.Id = counter.ToString("D3");
28: contacts.Add(contact);
29: }
30:
31: public void Put(Contact contact)
32: {
33: contacts.Remove(contacts.First(c => c.Id == contact.Id));
34: contacts.Add(contact);
35: }
36:
37: public void Delete(string id)
38: {
39: contacts.Remove(contacts.First(c => c.Id == id));
40: }
41: }
简单起见,我们利用一个静态字段(contacts)表示存储的联系人列表。当ContactsController类型被加载的时候,我们添加了两个ID分别为“001”和“002”的联系人记录。至于实现联系人CRUD操作的Action方法,我们也省略了必要的验证,对于本书后续的演示的实例,我们基本上也会采用这种“简写”的风格。