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来获取你想要的值或者设置值。

 

时间: 2024-12-01 14:52:54

Web APi 2.0优点和特点?在Web APi中如何启动Session状态?的相关文章

Asp.Net Web API 2第十三课——ASP.NET Web API中的JSON和XML序列化

原文:Asp.Net Web API 2第十三课--ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文描述ASP.NET Web API中的JSON和XML格式化器. 在ASP.NET Web API中,媒体类型格式化器(Media-type Formatter)是一种能够做以下工作的对象: 从HTTP消息体读取

【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

原文:[ASP.NET Web API教程]6.2 ASP.NET Web API中的JSON和XML序列化 谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予"推荐".但前几天有人询问为何很久没有更新,这让我感觉把这文章翻译出来还是有价值的.为此,本人打算将此工作继续下去.这些关于Web API的技术文章均由微软专业人员撰写,虽然文章作为博客帖子而写得比较简单

【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理

原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. Exception Handling in ASP.NET Web API ASP.NET Web API中的异常处理 本文引自:http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

【ASP.NET Web API教程】5.4 ASP.NET Web API批处理器

原文:[ASP.NET Web API教程]5.4 ASP.NET Web API批处理器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. Batching Handler for ASP.NET Web API 5.4 ASP.NET Web API批处理器 本文引自:http://bradwilson.typepad.com/blog/2012/06/batching-handler-for-web-api.html Brad W

Web&amp;nbsp;2.0如何创造内容

web 近几年,围绕Web 2.0这一话题展开的讨论层出不穷,从数量上讲,真的可以称得上是多如牛毛,不过,还是忍不住要老调重弹,再拿"Web 2.0"说事,今天谈论的主题是--Web 2.0,如何创造内容? Web是一个浩瀚的大平台,Web 2.0正是借助于这个平台生根.发芽.成长.壮大.有人把Web 2.0称作是一种理念,也有人把它归结为技术,并为此争论不休.不过,对于普通网民朋友来说,有多少人会去关注这种无聊的争吵呢?甚至相当比例的人听都没有听说过,他们想要得到的只是超酷.超眩的感

一个好的Web&amp;nbsp;2.0产品应该长什么样

web 自从有了Web 2.0,互联网就有了"产品"这个概念.因为,刻薄地说,Web 1.0没有产品. 各行各业有自己的行业标准,但一个好的Web 2.0产品长什么样?检验一个Web 2.0产品的好坏,有没有一个可供判断的标准?以下从我个人的体会,总结几点: 首先,用户驱动 一个好的Web 2.0产品,能够充分地调动用户的积极性,不断地为网站贡献信息和资源的.是用户驱动,而不是编辑驱动.Web2.0不能没有编辑,但编辑被弱化了.编辑驱动是Web 1.0,用户驱动是Web 2.0.Mys

使用 SOAP Toolkit 2.0 将现有代码作为 Web 服务提供

web 使用 SOAP Toolkit 2.0 将现有代码作为 Web 服务提供 使用 .NET 建立分布式应用程序 Steve Kirk 和 Priya DhawanMicrosoft Developer Network 摘要:本文介绍了使用 Microsoft SOAP Toolkit 版本 2.0 将现有 Microsoft Visual Basic 6.0 代码作为 Web 服务提供时所进行的数据转换. 目录简介 现有代码提供的数据类型 ADO 2x Command 对象 ADO 2x

geocoding-百度地图Geocoding API v1.0地址解析问题

问题描述 百度地图Geocoding API v1.0地址解析问题 如何使用第一步,申请key,点击这里获取密钥,申请key需要注册百度账号: 第二步,拼写发送http请求的url,注意需使用第一步申请的key: 第三步,接收http请求返回的数据(支持json和xml格式).这里的发送http请求的url和接收http请求返回的数据,应该怎么写?我用的是js,希望返回Json数据格式.下面是我写的这个功能函数的一部分. function getPosZuobiao(posName){ posN

Android BLE与终端通信(五)——Google API BLE4.0低功耗蓝牙文档解读之案例初探

Android BLE与终端通信(五)--Google API BLE4.0低功耗蓝牙文档解读之案例初探 算下来很久没有写BLE的博文了,上家的技术都快忘记了,所以赶紧读了一遍Google的API顺便写下这篇博客心得 Google API:http://developer.android.com/guide/topics/connectivity/bluetooth-le.html#terms 其实大家要学习Android的技术,Google的API就是最详细的指导书了,而且通俗易懂,就算看不懂