Web APi 2.0优点和特点?在Web APi中如何启动Session状态?

简介: 前言 曾几何时,微软基于Web服务技术给出最流行的基于XML且以扩展名为.asmx结尾的Web Service,此服务在.NET Framework中风靡一时同时也被.NET业界同仁所青睐,几年后在此基础上又扩展成为了WCF,基于SOAP协议,基于WCF标准需要一些配置上的改变。

前言

曾几何时,微软基于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来获取你想要的值或者设置值。

 

目录
相关文章
|
1月前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
40 1
|
23天前
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
43 8
只需四步,轻松开发三维模型Web应用
|
13天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
55 6
|
12天前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
在数字化时代,Web API成为连接前后端及构建复杂应用的关键。RESTful API因简洁直观而广受欢迎。本文通过实战案例,介绍Python Web开发中的RESTful API设计哲学与技巧,包括使用Flask框架构建一个图书管理系统的API,涵盖资源定义、请求响应设计及实现示例。通过准确使用HTTP状态码、版本控制、错误处理及文档化等技巧,帮助你深入理解RESTful API的设计与实现。希望本文能助力你的API设计之旅。
36 3
|
13天前
|
JSON API 数据库
从零到英雄?一篇文章带你搞定Python Web开发中的RESTful API实现!
在Python的Web开发领域中,RESTful API是核心技能之一。本教程将从零开始,通过实战案例教你如何使用Flask框架搭建RESTful API。首先确保已安装Python和Flask,接着通过创建一个简单的用户管理系统,逐步实现用户信息的增删改查(CRUD)操作。我们将定义路由并处理HTTP请求,最终构建出功能完整的Web服务。无论是初学者还是有经验的开发者,都能从中受益,迈出成为Web开发高手的重要一步。
36 4
|
11天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
32 1
|
13天前
|
JSON API 开发者
惊!Python Web开发新纪元,RESTful API设计竟能如此性感撩人?
在这个Python Web开发的新纪元里,RESTful API的设计已经超越了简单的技术实现,成为了一种追求极致用户体验和开发者友好的艺术表达。通过优雅的URL设计、合理的HTTP状态码使用、清晰的错误处理、灵活的版本控制以及严格的安全性措施,我们能够让RESTful API变得更加“性感撩人”,为Web应用注入新的活力与魅力。
30 3
|
13天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
43 3
|
15天前
|
JSON API 数据格式
深度剖析!Python Web 开发中 RESTful API 的每一个细节,你不可不知的秘密!
在 Python Web 开发中,RESTful API 是构建强大应用的关键,基于 Representational State Transfer 架构风格,利用 HTTP 卞性能。通过 GET、POST、PUT 和 DELETE 方法分别实现资源的读取、创建、更新和删除操作。示例代码展示了如何使用 Flask 路由处理这些请求,并强调了状态码的正确使用,如 200 表示成功,404 表示未找到资源等。
38 5
|
1月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
下一篇
无影云桌面