【WebApi】————.net WebApi开发(一)
【1】.部署环境.net4及以上版本。
【2】.vs2010 开发需单独安装vs2010 sp1和mvc4
mvc4:http://www.asp.net/mvc/mvc4
【3】.开发
1.新建项目选择ASP.net MVC 4 Web应用程序
2.选择Web API
3.在新建立的项目里面有已经生成的webapi模版
其中App_Start文件夹下WebApiConfig.cs和RouteConfig.cs文件主要配置api的路由信息。
Controllers文件夹下的文件为api的实现文件。其中ValuesController.cs是示例api文件。
4.新建自己的webapi文件。
在Controllers文件夹上单击鼠标右键,添加--控制器,我们新建一个TestApiController.cs的文件。其中TestApi是我们的Controller的名称在路由中使用。
5.我们新加入两个Get方法api,一个带参一个不带参
6.在WebApiConfig.cs文件中配置路由路径:routeTemplate: "api/{controller}/{Action}/{id}",
然后运行项目我们在地址栏中输入
controller:TestApi
action:我们写的方法名
id:传入的参数
7.同样我们可以写入Post方法等等。
WCF Web API支持多个宿主环境:自宿主(windows服务或者控制台)和IIS宿主(asp.net webform/mvc)。这个入门文章主要演示在ASP.NET MVC3网站宿主:
- 如何使用NuGet向项目中添加Web Api引用
- 如何创建一个通过HTTP GET访问的Web Api
- 如何通过asp.net routes宿主一个Web Api
- 如何通过浏览器或者Fiddler访问Web Api
- 如何在Api上启用OData uri查询
- 如何用WCF Web Test Client测试WCF Web API
1、创建一个基本的解决方案:使用VS2010新建一个空的ASP.NET MVC 3 Web Application
设置站点的端口号为9000
2、向解决方案中加入Web Api的引用
通过NuGet来添加Web api的程序集引用,右击项目属性,选择“Manage NuGet Packages”
在NuGet管理扩展器上查询Online的”webapi.all“
选择安装,NuGet就会下载所有所需的软件包,现在可以开始开发Web Api。
3、创建一个Contacts Api类
右击项目ContactManager选择添加一个文件夹,取名”APIs“,然后在APIs文件夹上右击添加类,类名叫做ContactsApi:
using System.ServiceModel;
namespace ContactManager.APIs
{
[ServiceContract]
public class ContactsApi
{
}
}
using ContactManager.APIs;
using System.ServiceModel.Activation;
routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory(), typeof(ContactsApi)));
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
MapServiceRoute需要一个泛型参数指定服务(API),以及一个将被追加到IIS base url的路径。在这里,我们指定的“contacts”,也就是宿主为“http://localhost:9000/api/contacts”。
5. 通过一个HTTP Get 方法暴露contacts:首先创建一个poco(Plain Old C#)Contract类,代表我们在api上传递的联系人,本质上就是一个DTO(数据传输对象),在HTTP上我们把它作为资源,然后创建一个HTTP Get方法暴露资源。
右击项目ContactManager项目选择添加新的文件夹“Resources”,在Resources文件下创建一个新的类Contact。
namespace ContactManager.Resources
{
public class Contact
{
public int ContactId { get; set; }
public string Name { get; set; }
}
}
返回到ContactApi类,添加下述引用:
using System.ServiceModel.Web;
using ContactManager.Resources;
添加一个Get方法返回所有的contracts
[WebGet(UriTemplate = "")]
public IQueryable<Contact> Get()
{
var contacts = new List<Contact>()
{
new Contact {ContactId = 1, Name = "Phil Haack"},
new Contact {ContactId = 2, Name = "HongMei Ge"},
new Contact {ContactId = 3, Name = "Glenn Block"},
new Contact {ContactId = 4, Name = "Howard Dierking"},
new Contact {ContactId = 5, Name = "Jeff Handley"},
new Contact {ContactId = 6, Name = "Yavor Georgiev"}
};
return contacts.AsQueryable();
}
Get方法上加了WebGet Attribute表示这是一个HTTP Get。注意这里的UriTemplate被设置为“”,默认情况下,操作的Uri是方法名Get,在这种情况下,我们是在Route中设置的Uri。
6、通过浏览器查询Contracts.按F5运行项目,然后再浏览器地址栏中输入http://localhost:9000/api/contacts
7、查询返回Json格式的Contracts。HTTP提供了一些“内容协商”机制 — 当有多个可得的表现形式的时候,对特定的响应选择最好的表现形式的处理过程。
服务器驱动协商(Server-driven Negotiation)
如果响应的最好的表现形式的选择是通过服务器上的算法来实现,那么这种方式的协商称做服务器驱动协商。选择是基于响应可得的表现形式(根据不同的维度,响应会不同;例如,语言,内容编码,等等)和请求消息里特定的头域或关于请求的其他信息(如:网络客户端的地址)。
服务器驱动协商是有优点的,当从可行的表现形式里进行选择的算法对用户代理进行描述是比较困难的时候,或者当服务器期望发送“最好的猜测”给客户端而只通过一个响应(以避免后续请求的回路(一个请求会返回一个响应)延迟如果此“最好的猜测“对用户适合的时候)的时候。为了改善服务器的猜测,用户代理应该包含请求头域(Accept,Accept-Language,Accept-Encoding,等等),这些头域能描述它对响应的喜好。
Web api返回的响应很容易添加一种媒体类型(media types )。
打开Fiddler,在“Request builder”栏输入地址“http://localhost:9000/api/contacts”,然后移动到“Request Headers”在“User-Agent” 项下方添加 “Accept: application/json”
按下 Exectue按钮,双击左边的Panel查看HTTP的response,切换到“Raw”Tab,你可以看到下面的json格式的数据:
8、启用OData 查询支持
Web API支持OData协议,接受OData的URI格式查询,当OData 查询到达Web Api, 在返回客户端之前在服务端会进行必要的过滤和排序。查询使用IQueryable 接口,服务端并没有去查询所有的数据,发送过滤和排序到服务端。
return contacts.AsQueryable();
运行程序,在浏览器里输入 http://localhost:9000/api/contacts?$Top=4&$OrderBy=Name ,看到浏览器之返回了按名字排序的top 4个contract
也可以通过Fidder去查询,具体可参照第7步。
9、WCF Web API也提供了一个WCF Web Test Client用于测试WCF Web API,通过配置启用,在RegisterRoutes方法里创建HttpConfiguration 实例,并设置EnableTestClient属性为True:
var config = new HttpConfiguration() { EnableTestClient = true };
然后把HttpConfiguration实例传递给HttpServiceHostFactory的配置属性
routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory() { Configuration = config }, typeof(ContactsApi)));
按下F5 启动调试项目,然后再浏览器后面加入/Test
总结
通过这个Quick start,我们学习到了以下内容
- 如何使用NuGet向项目中添加Web Api引用
- 如何创建一个通过HTTP GET访问的Web Api
- 如何通过asp.net routes宿主一个Web Api
- 如何通过浏览器或者Fiddler访问Web Api
- 如何在Api上启用OData uri查询
- 如何用WCF Web Test Client测试WCF Web API
你可以在这里获取到代码。
2011-10-4日更新到WebAPI 0.5 Preview
【WebApi】————.net WebApi开发(一)的更多相关文章
- 零基础ASP.NET Core WebAPI团队协作开发
零基础ASP.NET Core WebAPI团队协作开发 相信大家对“前后端分离”和“微服务”这两个词应该是耳熟能详了.网上也有很多介绍这方面的文章,写的都很好.我这里提这个是因为接下来我要分享的内容 ...
- .net core webapi 前后端开发分离后的配置和部署
背景:现在越来越多的企业都采用了在开发上前后端分离,前后端开发上的分离有很多种,那么今天,我来分享一下项目中得的前后端分离. B/S Saas 项目:(这个项目可以理解成个人中心,当然不止这么点功能 ...
- C# WebApi过滤器(开发接口必备利器)
在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理.引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想 ...
- webapi 使用Autofac 开发经历
2018/4/6 号 早上五点..被手机震动吵醒. 之后直接打开电脑,打算再加强下我自己的webapi这套东西. 虽然三年的工作经验接触了N多框架和各种风格的开发方式,但是让我自己来搞一套实在不会搞, ...
- 案例:1 Ionic Framework+AngularJS+ASP.NET MVC WebApi Jsonp 移动开发
落叶的庭院扫的一干二净之后,还要轻轻把树摇一下,抖落几片叶子,这才是Wabi Sabi的境界. 介绍:Ionic是移动框架,angularjs这就不用说了,ASP.Net MVC WebApi提供数据 ...
- 初始WebApi 利用WebApi实现基础的CRUD
微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService.它是简单,代码 ...
- What are the differences between WebAPI and WebAPI 2
http://stackoverflow.com/questions/21298961/what-are-the-differences-between-webapi-and-webapi-2 Maj ...
- WebApi:WebApi的Self Host模式
不用IIS也能執行ASP.NET Web API 转载:http://blog.darkthread.net/post-2013-06-04-self-host-web-api.aspx 在某些情境, ...
- Restful WebApi项目开发实践
前言 踩过了一段时间的坑,现总结一下,与大家分享,愿与大家一起讨论. Restful WebApi特点 WebApi相较于Asp.Net MVC/WebForm开发的特点就是前后端完全分离,后端使用W ...
- Restful WebApi开发实践
随笔分类 - Restful WebApi开发实践 C#对WebApi数据操作 摘要: ## 目标简化并统一程序获取WebApi对应实体数据的过程,方便对实体进行扩充.原理就是数据服务使用反射发现 ...
随机推荐
- <iostream> 和 <iostream.h>的区别 及 Linux下编译iostream.h的方法
0.序言 其实2者主要的区别就是iostream是C++标准的输入输出流头文件,而iostream.h是非标准的头文件. 标准头文件iostream中的函数属于标准命令空间,而iostream.h中的 ...
- Java-J2SE学习笔记-线程-生产者消费者问题
一.概述 模拟生产者消费者问题 二.代码 1.Consumer.java 2.Producer.java 3.SyncStack.java 4.Test.java 1.Consumer.java pa ...
- STM32F05x加入RDP(LV1)后,Segger无法Unlock的解决办法
沿用之前CM3核的STM32F10X系列的加入RDP功能,之后在Segger的Unsecured Chip或者Unlock STM32的Cmd无法进行去除RDP,而Unlock STM32则提示无法识 ...
- nasm fasm yasm 还是masm、gas
留个爪,稍后学习 选择编译器nasm?fasm?yasm?还是masm.gas或其他? 前面三个是免费开源的汇编编译器,总体上来讲都使用Intel的语法.yasm是在nasm的基础上开发的,与nasm ...
- Java笔记——equals和==的区别
摔在这里几次,还是记下来吧. 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html -------------- ...
- 280. Wiggle Sort
题目: Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] ...
- Babel 6 配置
Babel 6 较之前版本有些变化,几个比较重要的点. npm package babel 已经不在使用了,分成了下列几个 package babel-cli, 适用于命令行 babel-core, ...
- POJ 1904 HDU 4685
这两道题差不多,POJ这道我很久以前就做过,但是比赛的时候居然没想起来.. POJ 这道题的题意是,N个王子每个人都有喜欢的公主,当他们选定一个公主结婚时,必须是的剩下的人也能找到他喜欢的公主结婚. ...
- linux系统的目录讲解
还记得在前面介绍c h m o d命令时讲过,目录的权限位和文件有所不同.现在我们来看看其中的区别.目录的读权限位意味着可以列出其中的内容.写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你 ...
- 安装hma master出错 Error: Package: perl-Mail-Sender-0.8.13-2.el5.1.noarch
You are using the EPEL 5 version of the repo instead of 6, go into your /etc/yum.repos.d/epel.repo f ...