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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、源码特点       1、先进的 HTTP 编程模型: 使用新的强类型的 HTTP 对象模型直接操作 HTTP 请求和响应, 在 HTTP客户端使用相同的编程模型和 HTTP 管道;       2、支持路由: Web API 完整支持 ASP.NET 路由, 包括路由参数和约束。 此外, 到动作的映射支持约定, 从此将不再需要向类或者方法添加类似于 [HttpPost] 之类的属性;       3、内容协商: 客户端与服务端可以一起决定 API 返回数据的格式。 默认支持 XML, JSON 以及 Form URL-Encoded 格式, 可以扩展添加自定义格式, 甚至可以替换掉默认的内容协商策略;       4、模型绑定与验证: 模型绑定器可以轻易地从 HTTP 请求提取数据并转换成在动作方法使用的 .Net 对象;       5、过滤: Web API 支持过滤, 包括总所周知的 [Authorize] 过滤标记, 可以为 Action 添加并插入自定义过滤, 实现认证、异常处理等;       6、查询聚合: 只要简单的返回 Iqueryable , Web API 将会支持通过 OData 地址约定进行查询;       7、改进的 Http 细节可测试性: Web API 不是将 HTTP 细节设置到一个静态的 Context 对象上, 而是使用 HttpRequestMessage 和 HttpResponseMessage 实例, 可以使用这些对象的泛型版本为这些 Http 类型添加自定义类型;       8、改进的依赖反转 (IoC) 支持: Web API 使用 MVC Dependency Resolver 实现的服务定位器模式在不同的场景下来获取实例;       9、基于代码的配置: Web API 单独使用代码完成配置, 从而保证了配置文件的整洁;       10、自托管 (Self-Host) : Web API 除了可以托管在 IIS , 还可以托管在进程,依旧可以使用路由以及其它的特性。 二、注意事项       1、开发环境为Visual Studio 2012,数据库为SqlServer2008,使用.net 4.0开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值