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

 

目录
相关文章
|
测试技术 API
【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决
前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿。而这之前,程序之间通信效率的王者也许可以算得上是gRPC了。那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着比拼一下minimal api服务和gRPC服务在通信上的效率。
363 0
【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决
|
Web App开发 XML 开发框架
WebAPI学习(一)——创建Web API程序
WebAPI学习(一)——创建Web API程序
248 0
|
编解码 JavaScript 前端开发
Web API——Web API介绍
Web API——Web API介绍
179 0
Web API——Web API介绍
|
.NET API 数据格式
Asp.Net Core WebAPI使用Swagger时API隐藏与分组
Asp.Net Core WebAPI使用Swagger时API隐藏与分组1、前言为什么我们要隐藏部分接口? 因为我们在用swagger代替接口的时候,难免有些接口会直观的暴露出来,比如我们结合Consul一起使用的时候,会将健康检查接口以及报警通知接口暴露出来,这些接口有时候会出于方便考虑,没有进行加密,这个时候我们就需要把接口隐藏起来,只有内部的开发者知道。
2664 0
|
.NET API 开发框架
从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller
原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller 版权声明:本文为博主原创文章,未经博主允许不得转载。
1215 0
|
XML JSON .NET
ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了
引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者的心情。
7297 0
|
XML JSON 中间件
【WebAPI No.4】Swagger实现API文档功能
介绍: Swagger也称为Open API,Swagger从API文档中手动完成工作,并提供一系列用于生成,可视化和维护API文档的解决方案。简单的说就是一款让你更好的书写API文档的框架。 我们为什么选择swagger,现在的网站开发结果越来越注重前后端的分离,比如以前的webFrom到现在的mvc模式都是为了这个前后端的分离。
1721 0
|
测试技术 API 数据安全/隐私保护
【WebAPI No.3】API的访问控制IdentityServer4
介绍: IdentityServer是一个OpenID Connect提供者 - 它实现了OpenID Connect和OAuth 2.0协议。是一种向客户发放安全令牌的软件。 官网给出的功能解释是: 保护您的资源 使用本地帐户存储或通过外部身份提供商对用户进行身份验证 提供会话管理和单...
1900 0
|
Web App开发 JavaScript 前端开发
|
Web App开发 JSON 前端开发

热门文章

最新文章