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 } } }
下面是測試用的ASPX網頁程式碼。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; } } } }
<%@ 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中使用Session、Cache和Application的幾個方法
在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) {/* 處理邏
php中print_r、var_dump和var_export幾個函式的用法區別 。php setcookie一些限制。php不同路徑cookies取值問題。PHP獲取站點根目錄
php中print_r、var_dump和var_export幾個函式的用法區別 print_r ( $array/$var ) print 是列印的意思,而r則取自Array的單詞,那麼該函式的功能就是列印陣列內容,它既可以列印陣列內容,也可以列印普通的變數
在ASP.NET中使用Session、Cache與Application時注意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有著簡單、靈活和無處不在的特點。你能想到的差點兒全