ASP.NET Web API具有与ASP.NET MVC类似的编程方式,相关内容较少,如下通过一个实例讲解WebApi的集中寄宿方式。

目录
构建解决方案
定义Web API
以Web Host方式寄宿Web API
以Self Host方式寄宿Web API
利用HttpClient调用Web 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:     string Id { get; set; }
   4:     string Name { get; set; }
   5:     string PhoneNo { get; set; }
   6:     string EmailAddress { get; set; }
   7:     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方法。

class ContactsController: ApiController
static List<Contact> contacts;
   4: static int counter = 2;
   5: 
static ContactsController()
   7:     {
   8:         contacts = new List<Contact>();
   9:         contacts.Add(new Contact { Id = "001",Name = "张三",
  10:             PhoneNo = "0512-12345678",EmailAddress = "zhangsan@gmail.com",monospace!important">  11:             Address = "江苏省苏州市星湖街328号" });
  12:         contacts.Add("002",128)">"李四",monospace!important">  13:             PhoneNo = "0512-23456789",128)">"lisi@gmail.com",monospace!important">  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:     void Post(Contact contact)
  25:     {
  26:         Interlocked.Increment(ref counter);
  27:         contact.Id = counter.ToString("D3");
  28:         contacts.Add(contact);
  29:     }
  30: 
  31:     void Put(Contact contact)
  32:     {
  33:         contacts.Remove(contacts.First(c => c.Id == contact.Id));
  34:         contacts.Add(contact);
  35:     }
  36: 
  37:     void Delete(string id)
  38:     {
  39:         contacts.Remove(contacts.First(c => c.Id == id));        
  40:     }
  41: }

WebApi的几种寄宿方式的更多相关文章

  1. Swift iOS 9通讯录访问

    viewmode=list我的stackoverflow前言:在iOS9之前,一直使用AddressBook这个framework来访问用户通讯录。

  2. [Swift] Enum 好用, Enum 可以更易用

    只需要写少量的几行声明:如下.选中,右键,选择"Services|generate_enum"然后如下代码就自动生成了:怎么样?当然还有其他选项可以使用.如果你有其他需要麻烦告诉我.当然有PR最好了.最后来张动图感受一下:代码在:OSCGitGithub

  3. swift – 交换机:枚举交换机问题:不是int的成员

    我在Swift中编写了我的第一个项目,由于某种原因,我无法找出为什么我的枚举和开关不工作属性开关我得到的错误是枚举大小写“viewmodeFavourite”不是“Int!”类型的成员所以我改为这个,因为它不是一个Int!forStoryboard)然后我得到枚举大小写模式不能匹配非枚举类型“Int”的值你必须将contactviewmode声明为Contactviewmode而不是Int。如果您真的希望它是Int,那么您必须通过将变量与枚举情况的rawValue属性进行比较来更改交换机中的大小写:但除非

  4. android – ContactsContract.CommonDataKinds.StructuredName的问题

    在查询联系人数据时,我得到了大部分工作.我正在与Structuredname和Organization战斗.他们不适合我.如果您不介意,请查看代码.它是手工制作的,并且删除了大量错误检查,以使其尽可能小地发布在此处.“不工作”的评论是对我不起作用的部分.两个前导if()是onActivityResult的一部分,我在联系人选择结束时收到数据.通过以下方式拨打电话:提前谢谢了HJW解决方法你的情况是错的.用于Structuredname:

  5. 如何在我的Android程序中访问联系人

    我正在制作短信应用程序并希望在我的Android应用程序中访问联系人.我想访问联系人,就像他们在实际联系人列表中的位置一样.选择后,我需要返回我的活动,我可以向该人发送短信.或者是否可以访问存储联系人的数据库?我的代码如下所示:我的LogCat看起来像这样:谁能帮我?解决方法使用此代码选择联系人:

  6. 如何避免在Android上的onCreate上重新创建视图?

    如何避免重新创建列表?

  7. 启动时Android应用程序崩溃:ContactsFragment中的SQLite NullPointerException

    我正在集成数据库来保存和存储以后要检索的基本联系信息.但是,我的应用程序现在在启动时崩溃,所以我甚至无法验证是否正在创建表等.数据库处理程序代码:logcat说问题是sqliteDatabasedb=this.getWriteableDatabase();这也是我违规的Contactsfragment:最后,这是ContactsDB类:非常感谢任何帮助–我认为问题在于我的Context为null.

  8. 在android中获取联系人非常慢

    我编写了一个代码来从联系人中获取联系人姓名,电话号码和图像,并将其显示在android的listview中.它工作正常,但需要更多时间来加载.我曾尝试在代码的某些部分使用多线程.但加载时间并未减少.这是onCreate()方法:以下是获取联系人的代码:这里,listview的setAdapter()函数在将所有联系人提取到ArrayList之后正在工作.有没有人知道如何在获取联系人期间显示联系人?

  9. 如何获取Android中联系人的所有详细信息

    给定联系人ID,我可以通过对每个字段进行不同的查询来获取各种联系人详细信息.但有没有一种方法可以通过单个查询获取与此联系人ID相关的所有详细信息?解决方法不得不改变ContentProviders上的一些教程,因为它引用了弃用的类,这可能会有所帮助.

  10. android – 如何使用一个查询搜索带地址的联系人(FORMATTED_ADDRESS)?

    我尝试对用户联系人实施实时搜索,我想获取每个匹配联系人的姓名,缩略图和地址(如果有).用户键入时正在运行实时搜索.所以他输入了ma并将获得’martin’,’matthews’……

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部