1. 程式人生 > >ASP.NET Web Api中使用Session、Cache和Application的幾個方法

ASP.NET Web Api中使用Session、Cache和Application的幾個方法

        在ASP.NET中,Web Api的控制器類派生自ApiControll,該類與ASP.NET的Control類沒有直接關係,因此不能像在ASPX.CS程式碼隱藏類中直接使用HttpContext、HttpApplicationState或HttpSessionState等狀態資料。要使用的話,一般是從System.Web.HttpContext.Current靜態物件引用HttpContext,從而使用Session等狀態資料。

        不過,要在控制器類中通過HttpContext的Session屬性直接使用Session狀態資料,將丟擲null reference異常。網查主要有兩個解決辦法,一個是過載Global的Init()方法,在該方法的中開放Session狀態,另一個設計帶Session的路由處理器。

        下面程式碼是包含兩個解決方法的Global類。

<pre name="code" class="csharp">using System;
using System.Web;
using System.Web.Routing;
using System.Web.Http;
using System.Web.Http.WebHost;
using System.Web.SessionState;

namespace ApiControllerExample
{
    public class Global : System.Web.HttpApplication
    {

        public override void Init()
        {
            //this.PostAuthenticateRequest += (s, e) => HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
            base.Init();
        }

        protected void Application_Start(object sender, EventArgs e)
        {
            RouteConfig.RegisterRoutes(RouteTable.Routes);  // 註冊路由
        }
    }

    public class SessionableControllerHandler : HttpControllerHandler, IRequiresSessionState
    {
        public SessionableControllerHandler(RouteData routeData) : base(routeData) { }
    }

    public class SessionStateRouteHandler : IRouteHandler
    {
        IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
        {
            return new SessionableControllerHandler(requestContext.RouteData);
        }
    }

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.MapHttpRoute(
                name: "WebApiRoute1",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            ).RouteHandler = new SessionStateRouteHandler();  // 使用Session


            routes.MapHttpRoute(
              name: "WebApiRoute2",
              routeTemplate: "api/{controller}/{id}/{id2}",
              defaults: new{id = RouteParameter.Optional }
          );  // 不使用Session
        }
    }
}
        為測試上述行為,編寫了如下控制器程式碼。
using System;
using System.Web.Http;

namespace ApiControllerExample
{
    public class StateController : ApiController
    {
        public string Get(int id)
        {
            try
            {
                return  GetStateInfo(id);
            }
            catch (Exception err)
            {
                return "excep: " + err.Message;
            }
        }

        private string GetStateInfo(int id)
        {
            System.Web.HttpContext context = System.Web.HttpContext.Current;

            if (id == 1)
            {
                return context.Session["state"].ToString();
            }
            else if (id == 2)
            {
                return context.Cache["state"].ToString();
            }
            else
            {
                return context.Application["state"].ToString();
            }
        }
 
        public string Get(int id, int id2)
        {
            System.Web.HttpContext context = System.Web.HttpContext.Current;

            try
            {
                return context.Session["state"].ToString();
            }
            catch (Exception err)
            {
                return "excep: " + err.Message;
            }
        }
    }
}
        下面是測試用的ASPX網頁程式碼。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ApiControllerExample.Test" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script>
        function GetXmlHttpRequest() {
            if (window.XMLHttpRequest) {
                return new XMLHttpRequest();
            }
            else if (window.ActiveXObject) {
                return new ActiveXObject("Microsoft.XMLHTTP");
            }
            return null;
        }

        function GetState(id) {
            var request = GetXmlHttpRequest();
            var url = "/api/state/" + id;
            request.open("GET", url, false);
            request.send(null);
            alert(request.responseText);
        }

        function GetState2() {
            var request = GetXmlHttpRequest();
            var url = "/api/state/1/1";
            request.open("GET", url, false);
            request.send(null);
            alert(request.responseText);
        }
    </script>
</head>
<body>
    <input type="button" value="GetSession" onclick="GetState(1)" />
    <input type="button" value="GetCache" onclick="GetState(2)" />
    <input type="button" value="GetAppication" onclick="GetState(3)" />
    <input type="button" value="GetSession(state2)" onclick="GetState2()" />
</body>
</html>

       下面是網頁的程式碼隱藏類。

using System;

namespace ApiControllerExample
{
    public partial class Test : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string time = DateTime.Now.ToString();

            Session["state"] = time;
            Cache["state"] = time;
            Application["state"] = time;
        }
    }
}
       測試時,可以取消Global類中的有關注釋即可。

       比較兩個實現方法可以知道,使用帶Session的路由處理器方法可以指定某個路由開放Session(比如上面的api/{controller}/{id}/{id2},就不能讀取Session中的資料)。而使用Global的Init()方法中開放Session,將使得全部Api都可以訪問Session。



相關推薦

ASP.NET Web Api使用SessionCacheApplication方法

        在ASP.NET中,Web Api的控制器類派生自ApiControll,該類與ASP.NET的Control類沒有直接關係,因此不能像在ASPX.CS程式碼隱藏類中直接使用HttpContext、HttpApplicationState或HttpSessi

(四)Asp.net web api的坑-【api的返回值】

技術分享 要求 data 都是 blog pan odi handle 自己 void無返回值 IHttpActionResult HttpResponseMessage 自定義類型 我這裏並不想贅述這些返回類型, 可以參考博文http://blog.csdn.net/

ASP.NET Web API使用GZIP 或 Deflate壓縮

== too light class using GZip壓縮 public remove log 對於減少響應包的大小和響應速度,壓縮是一種簡單而有效的方式。 那麽如何實現對ASP.NET Web API 進行壓縮呢,我將使用非常流行的庫用於壓縮/解壓縮稱為DotNetZ

ASP.NET Web API對Headers的操作

ASP.NET Web API中對Headers的操作。 1、獲取請求頭資訊 string value = HttpContext.Current.Request.Headers["name"]; 2、新增響應頭資訊 HttpResponseMessage result = ne

ASP.NET Web API 使用 swagger 來管理 API 文件

  本文以 ASP.NET Web API 為後臺框架,利用 EF6 連線 postgreSQL 資料庫,使用 swagger 來生成 REST APIs文件。文章分二個部分,第一部分主要講如何用 EF6 連線 postgreSQL,第二部分是介紹如何整合 swagg

理解 ASP.NET Web API 的 HttpParameterBinding

背景   問題的起因是這樣的。群裡面一個哥們兒發現在使用 ASP.NET WebAPI 時,不能在同一個方法簽名中使用多次 FromBodyAttribute 這個 Attribute 。正好我也在用 WebAPI,不過我還沒有這種需求。所以就打算研究一下。 異常資訊   當使用多個 FromBod

ASP.NET Web API如何傳遞引數

 一、簡單型別的傳遞 1、傳遞1個引數 獲取方式: public Users Get(int id) 傳遞方式: (1)、api/default/5 (2)、$.get("/api/default",{id:90}, function (data) {/* 處理邏

phpprint_rvar_dumpvar_export函式的用法區別 。php setcookie一些限制。php不同路徑cookies取值問題。PHP獲取站點根目錄

php中print_r、var_dump和var_export幾個函式的用法區別   print_r ( $array/$var )  print 是列印的意思,而r則取自Array的單詞,那麼該函式的功能就是列印陣列內容,它既可以列印陣列內容,也可以列印普通的變數

ASP.NET使用SessionCacheApplication時注意IIS應用程式池的空閒超時

在.NET的ASP.NET、ASP.NET MVC與WebService等應用中,常常使用Session、Cache或Application儲存伺服器端共享資料,如果沒有使用SqlServer儲存這些緩衝區資料,那麼就存在超時與過期問題:超時後Session和Cache就過期

How ASP.NET Web API 2.0 Works?[持續更新…]

throws case rep 生命 indexof http face auto 攔截 一、概述 RESTful Web API [Web標準篇]RESTful Web API [設計篇] 在一個空ASP.NET Web項目上創建一個ASP.NET Web API 2.

ASP.NET Web API 過濾器創建執行過程(二)

reading mar model驗證 type() 方法的參數 public 所有 ring attr 前言 前面一篇中講解了過濾器執行之前的創建,通過實現IFilterProvider註冊到當前的HttpConfiguration裏的服務容器中,當然默認的基礎服務也是

關於ASP.NET Web API 客戶端的請求報文新增 Authorization

public class ReqAuthorizeAttribute:System.Web.Http.AuthorizeAttribute { /// <summary> /// 進行驗證 /// </summary> /

ASP.NET Web API 2 的特性路由

導航頁面 上一步 開始 路由是指 Web API 將URI匹配到一個action。 Web API 2 支援一種新的路由方式,叫做“特性路由”。就像它的名字所示,特性路由使用特性來定義路由規則。特性路由可以讓你更好的控制 Web API 的

.net web api 呼叫post方法呼叫自定義方法名session使用

        在開發web api的時候我們需要呼叫post方法或自定義的方法的時候,還有使用session來儲存相關的資料,首先我介紹一下如何在web api中使用session,在使用session的時候我們需要配置儲存session機制,啟用session功能,在G

asp.net web api 開啟HttpContext 的Session功能

在Controller裡:  public class ValuesController : ApiController     {         // GET api/values         public IEnumerable<string> Get

Asp.net Web Api 解決跨域問題

asp oss ros ner div exec space out color using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syst

[ASP.NET Web API]如何Host定義在獨立程序集中的Controller

eps 運行 icon tel conf clu XML dom tex 通過《 ASP.NET Web API的Controller是如何被創建的?》的介紹我們知道默認ASP.NET Web API在Self Host寄宿模式下用於解析程序集的AssembliesRes

[轉]ASP.NET web API 2 OData enhancements

{0} per yourself res demon services host iss ges 本文轉自:https://www.pluralsight.com/blog/tutorials/asp-net-web-api-2-odata-enhancements Al

探秘如何操作 ASP.NET Web API (三)

asp ajax請求 log pic margin div 判斷 out turn 經過我三篇文章的解惑,webapi我相信大家沒有問題了! 先創建了一個UserModel public class UserModel { public string UserI

Web API系列教程】1.1 — ASP.NET Web API入門

表示 return param 全部 products cap asp.net control toys 前言 HTTP不僅僅服務於web頁面。同一時候也是構建暴露服務和數據的API的強大平臺。HTTP有著簡單、靈活和無處不在的特點。你能想到的差點兒全