Web APi 2.0优点和特点?在Web APi中如何启动Session状态?
前言
曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此基础上又扩展成为了WCF,基于SOAP协议,基于WCF标准需要一些配置上的改变。现如今,大势所趋我们只需要HTTP协议以及更加优美的JSON格式,这时将不得不出现一个更加轻量级的Web服务技术。当然,Web Service和WCF虽然有其局限性但是其仍被许多企业所广泛应用,说明一时半会还不会被淘汰,也有其存在的价值。
此时Web APi出现了,Web APi是一个仅仅只支持HTTP协议而且非常强大的框架并且默认是JSON格式,我们和需要配置如endpoint、contarcts等繁琐的配置的Web Service和WCF画上了句号。Web APi基于ResetFul服务轻量而且强大,下面我们来看看Web APi是如何的强大以及轻量,它的优点和特点在哪里?
优点
我们首先来看一张图,如下

接下来我们一一解释上述优点
Configuration
在WCF中我们需要endpoints和contracts,但是在Web APi中我们根本不需要这些设置(超简单)。
默认是RESET
不像WCF,在WCF中一个服务对应的是从一个地址到一个物理文件(简言之:一个地址被映射到一个服务类或者是.svc文件),当物理文件移除位置或者删除其产生的影响可想而知,但是在Web APi中一个服务地址是一个RESET路由,并且该路由被映射到一个控制器上的方法(很灵活)。
Simpler Extensible Processing PipeLine
Web APi提供了一套高度可扩展的消息处理管道机制,其中如DelegateHandler以及Filer提供了请求和响应的机制。Handler允许我们在被激活的控制器以及控制器上方法进行自定义错误处理,同时它也能够被配置来处理不同控制器上的路由。而Filter中包含了相应的类以及方法在控制器上的方法被调用之前和之后来允许我们运行一些代码,例如:action filter、exception filter等等,与此同时这些过滤器对应的特性能够修饰控制器上的方法,可以修饰单个或者全局皆可(高扩展)。
Abstraction With Route
给予Web服务开发者一个稍抽象的路由,但是开发者能够看到并易懂这样的一个实现,我们能够映射任何一个URL到一个控制上的方法,换言之,这样的抽象就不会具体对应到哪个文件或者是哪个具体的接口,只要URL对应一个有效的控制器方法我们就只需要在对应的方法进行我们的实现即可(稍抽象路由)
特点
我们继续以一张图来概括

Convention-based CRUD Action
HTTP方法自动映射到控制器上对应的方法,并且通过URL里所传递的参数Web APi也会自动匹配,当然可能手动需要进行简单的配置,其增删改查分别对应HTTP方法中的POST、GET、DELETE等。
Built-in Content Negotiation
我们知道在MVC上的控制器返回什么数据格式,如JSON或者XML需要我们去显示指定返回的类型,但是在Web APi上的控制器对应的方法只需要返回原始数据值即可,它会根据调用者的请求自动进行转换为JSON或者XML。
Attribute Routing And Route Prefixs
路由特性以及路由前缀都是非常明确的路由定义并且与我们控制器上的HTTP方法相关联。
Route Constraints
对于特定的业务需求我们需要不同的路由来进行约束,比如类型,值的范围等,Web APi中的路由约束是一个非常棒的特点。
CORS Support
这个跨域特点的支持真是让我们大饱眼福,能够完全进行js跨域请求,满足所需。
Global Error Handling
在这个特点中,所有未被处理的错误机制都会被抓取到,通过访问的错误异常以及异常所在的上下文Web APi能够支持多个异常处理记录。
总结
从上可知,Web APi的强大以及灵活是WCF以及Web Service所无法比拟的,在Web服务技术中,Web APi的简洁以及优雅已经成为最佳服务技术选择。当然这也是站在Web Service以及WCF的肩膀上或者是时代的需求所发展出来的,我们只需明白:脚有多大,就穿多大鞋。
启动Session状态
前言
之前这个话题我是不知道的,在【嗨博客】中有群友问才知道在Web APi中是不支持Session的,说的更加精准一点是默认没有启动Session,这里就统一进行下学习,希望你有所收获。 在Web APi中的Session不依赖于System.Web,如若要将Web APi运行在ASP.NET运行时,此时我们需要启动Session,当我们只要是在Web APi环境中就启动APi该如何做?有两种实现方式,请往下看。
Web APi全局启动Session(一)
以下皆在Global.asax全局文件中进行。
第一步(定义两个变量)
private const string WebApiPrefix = "APi";
private static string WebApiExecutePath = string.Format("~/{0}", WebApiPrefix);
第二步(获取当前请求的路径)
private bool isWebAPiRequest()
{
return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.StartsWith(WebApiExecutePath);
}
第三步(若请求Web APi则启动Session)
protected void Application_PostAuthorizeRequest()
{
if (isWebAPiRequest())
{
HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
}
第四步(测试代码)
protected void Session_Start()
{
HttpContext.Current.Session.Add("xpy0928", "嗨-博客");
var session_value = HttpContext.Current.Session["xpy0928"];
}
测试如下图:

Web APi全局启动Session(二)
之前我们在Web APi系列中讲到过HttpControllerRouteHandler,此类中的GetHttpHandler方法返回HttpControllerHandler的一个实例即HttpHandler,通过此HttpHandler是进入Web APi消息处理管道的入口点,我们可以使用在IHttpHandler上的Session实现IRquiressionstate接口即可。
第一步(启动Session)
protected void Application_PostAuthorizeRequest()
{
HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
第二步(自定义实现HttpControllerRouteHandler)
public class EnableSession_HttpControllerRouteHandler : HttpControllerRouteHandler
{
protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext)
{
return new EnableSession_ControllerHandler(requestContext.RouteData);
}
}
第三步(自定义实现HttpControllerHandler来获取HttpHandler)
public class EnableSession_ControllerHandler : HttpControllerHandler, IRequiresSessionState
{
public EnableSession_ControllerHandler(RouteData routeData)
: base(routeData)
{ }
}
第四步(路由配置进行获取自定义RouteHandler)
routes.MapHttpRoute(
name: "DefaultAPi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = UrlParameter.Optional }
).RouteHandler = new EnableSession_HttpControllerRouteHandler();
第五步(在Web APi配置文件中实现自定义HttpControllerRouteHandler)
public static void Register(HttpConfiguration config)
{
var httpControllerRouteHandler = typeof(HttpControllerRouteHandler).GetField("_instance",
BindingFlags.Static |
BindingFlags.NonPublic); if (httpControllerRouteHandler != null)
{
httpControllerRouteHandler.SetValue(null,
new Lazy<HttpControllerRouteHandler>(() => new EnableSession_HttpControllerRouteHandler(), true));
} config.MapHttpAttributeRoutes(); }
此时运行将出现如下错误:

【注意】解决方案:在Web API中属性路由引起的HttpConfiguration.EnsureInitialized异常
第六步(测试代码)
public void Get()
{
object context;
if (Request.Properties.TryGetValue("MS_HttpContext", out context))
{
var httpContext = context as HttpContextBase;
if (httpContext != null && httpContext.Session != null)
{
var lastValue = httpContext.Session["xpy0928"] as int?;
httpContext.Session["xpy0928"] = "博客园";
var session_value = httpContext.Session["xpy0928"];
}
}
}
总结
以上两种方法皆可在Web APi中启动Session,你觉得那个简单就按照对应的来。但我们需要注意一个问题:在Web APi中,Web APi是不依赖于HttpContext,也就是HttpContext.Current肯定是为null的,我们要访问Session或者其他对象需要使用Request对象中的属性Properties来获取你想要的值或者设置值。
Web APi 2.0优点和特点?在Web APi中如何启动Session状态?的更多相关文章
- 在 Visual Studio 2013 中创建 ASP.NET Web 项目(0):专题导航 [持续更新中]
写在前面的话 随着 Visual Studio 2013 的正式推出,ASP.NET 和 Visual Studio Web 开发工具 也发布了各自的最新版本. 新版本在构建 One ASP.NET ...
- 一个ASP.NET Web API 2.0应用
在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.N ...
- cannot change version web module 3.0
eclipse如何修改dynamic web module version 由于从SVN down下来的工程java及tomcat 版本比本地高,导致工程不能编译,报以下错误. 1.Java comp ...
- spring web flow 2.0入门(转)
Spring Web Flow 2.0 入门 一.Spring Web Flow 入门demo(一)简单页面跳转 附源码(转) 二.Spring Web Flow 入门demo(二)与业务结合 附源码 ...
- 关于项目报错Dynamic Web Module 3.0 requires Java 1.6 or newer 的解决方法
起因:今天使用maven创建web项目的时候发现项目上老是有个红X,错误如下图所示,虽然项目能正常运行起来,但是LZ的强迫症发作,不弄掉就觉得心里不舒服,于是上网查了攻略,几经周折最终大功告成,现在就 ...
- 使用maven创建项目和cannot change version web module 3.0
近期下载了最新的Eclipse mars.2, 这个eclipse自带了maven插件,于是就用maven尝试创建一个java web项目. 第一步,例如以下图所看到的选择 Maven Project ...
- 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用
由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...
- How ASP.NET Web API 2.0 Works?[持续更新中…]
一.概述 RESTful Web API [Web标准篇]RESTful Web API [设计篇] 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用 二.路由 ...
- ASP.NET Web API 2.0新特性:Attribute Routing1
ASP.NET Web API 2.0新特性:Attribute Routing[上篇] 对于一个针对ASP.NET Web API的调用请求来说,请求的URL和对应的HTTP方法的组合最终决定了目标 ...
随机推荐
- 【BZOJ3036】绿豆蛙的归宿 概率与期望
最水的概率期望,推荐算法合集之<浅析竞赛中一类数学期望问题的解决方法> #include <iostream> #include <cstdio> using na ...
- 无法连接虚拟设别 ide1:0.
安装虚拟机时出现提示:无法连接虚拟设备 ide1:0,因为主机上没有相应的设备.您要在每次开启此虚拟机时都尝试连接此虚拟设备吗? ide1:0一般是虚拟机的光驱,配置选项是“使用物理驱动器”,而宿主机 ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- 关于MVC的开源商城 Nop之闲聊
nopcommerce是国外的一个高质量的开源b2c网站系统,基于EntityFramework4.0和MVC3.0,使用Razor模板引擎,有很强的插件机制,包括支付配送功能都是通过插件来实现的,基 ...
- Python模块之day4
模块,代码归类实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能 ...
- cocos2d中各种action方法的应用
Action示例: 1.移动动作 cc.MoveBy:create(time, posX, posY) 在time时间内,相对当前位置基础上移动x,y个单位. cc.MoveTo:create(ti ...
- iOS在线更新framework,使用NSBundle动态读取
官方文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/LoadingCode/Tasks/Loadin ...
- PostgreSQL 与 MySQL 相比,优势何在?
一. PostgreSQL 的稳定性极强, Innodb 等引擎在崩溃.断电之类的灾难场景下抗打击能力有了长足进步,然而很多 MySQL 用户都遇到过Server级的数据库丢失的场景——mysql系统 ...
- ENode框架Conference案例分析系列之 - Quick Start
前言 前一篇文章介绍了Conference案例的架构设计,本篇文章开始介绍Conference案例的代码实现.由于代码比较多,一开始就全部介绍所有细节,估计很多人接受不了,也理解不了.所以,我先进行一 ...
- MySQL 启动服务报错解决方案
标签:ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid) 概述 文章 ...