ASP.NET?Core在WebApi項(xiàng)目中使用Cookie
一、Cookie的作用
Cookie通常用來(lái)存儲(chǔ)有關(guān)用戶信息的一條數(shù)據(jù),可以用來(lái)標(biāo)識(shí)登錄用戶,Cookie存儲(chǔ)在客戶端的瀏覽器上。在大多數(shù)瀏覽器中,每個(gè)Cookie都存儲(chǔ)為一個(gè)小文件。Cookie表示為鍵/值對(duì)的形式,可以利用鍵來(lái)讀取、寫(xiě)入或刪除Cookie。
在ASP.NET Core中也可以使用Cookie來(lái)維護(hù)回話狀態(tài),包含回話ID的Cookie會(huì)隨著每個(gè)請(qǐng)求一起發(fā)送到客戶端。
二、在ASP.NET Core中使用Cookie
我們創(chuàng)建一個(gè)ASP.NET Core WebApi的項(xiàng)目,然后在WebApi中測(cè)試使用Cookie。

1、在控制器中直接使用Cookie
在項(xiàng)目中添加一個(gè)控制器,用來(lái)測(cè)試Cookie:

1.1、設(shè)置Cookie
我們?cè)诳刂破骼锩婵梢允褂孟旅娴拇a設(shè)置Cookie:
HttpContext.Response.Cookies.Append("setCookie", "CookieValue");如果想設(shè)置Cookie的過(guò)期時(shí)間,我們可以使用Append的重載方法:
CookieOptions options = new CookieOptions();
// 設(shè)置過(guò)期時(shí)間
options.Expires = DateTime.Now.AddDays(1);
HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options);控制器里面的方法代碼如下:
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace CookieDemo.Controllers
{
[Route("api/")]
[ApiController]
public class CookieTestController : ControllerBase
{
/// <summary>
/// 設(shè)置Cookie
/// </summary>
[HttpGet]
[Route("SetCookie")]
public void Get()
{
HttpContext.Response.Cookies.Append("setCookie", "CookieValue");
CookieOptions options = new CookieOptions();
// 設(shè)置過(guò)期時(shí)間
options.Expires = DateTime.Now.AddDays(1);
HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options);
}
}
}CookieOptions類(lèi)可以在創(chuàng)建Cookie時(shí)指定如下的附加屬性:
- 域:用于指定與Cookie關(guān)聯(lián)的域。
- 過(guò)期時(shí)間:用于指定Cookie的過(guò)期時(shí)間。
- 路徑:用于指定Cookie路徑。
- 安全策略:用于指定Cookie是否可以通過(guò)HTTPS訪問(wèn)。
- HttpOnly:用于指定Cookie是否僅對(duì)服務(wù)器可用。
運(yùn)行程序,我們首先訪問(wèn)WeatherForecast控制器,并且查看Cookie信息:

我們看到,這里只有一個(gè)Cookie信息,接下來(lái)方法SetCookie方法:

我們看到,這里已經(jīng)有我們剛才添加的Cookie信息了。
1.2、獲取Cookie
我們可以根據(jù)key來(lái)獲取Cookie信息:
HttpContext.Request.Cookies["key"];
我們來(lái)看具體代碼:
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace CookieDemo.Controllers
{
[Route("api/")]
[ApiController]
public class CookieTestController : ControllerBase
{
/// <summary>
/// 設(shè)置Cookie
/// </summary>
[HttpGet]
[Route("SetCookie")]
public void Get()
{
HttpContext.Response.Cookies.Append("setCookie", "CookieValue");
CookieOptions options = new CookieOptions();
// 設(shè)置過(guò)期時(shí)間
options.Expires = DateTime.Now.AddDays(1);
HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options);
}
/// <summary>
/// 根據(jù)key獲取Cookie的Value值
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetCookie")]
public string GetCookid()
{
return HttpContext.Request.Cookies["setCookie"];
}
}
}運(yùn)行程序,查看效果:

1.3、刪除Cookie信息
我們可以根據(jù)key刪除Cookie信息,如下代碼:
HttpContext.Response.Cookies.Delete("key");接下來(lái)看具體代碼:
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace CookieDemo.Controllers
{
[Route("api/")]
[ApiController]
public class CookieTestController : ControllerBase
{
/// <summary>
/// 設(shè)置Cookie
/// </summary>
[HttpGet]
[Route("SetCookie")]
public void Get()
{
HttpContext.Response.Cookies.Append("setCookie", "CookieValue");
CookieOptions options = new CookieOptions();
// 設(shè)置過(guò)期時(shí)間
options.Expires = DateTime.Now.AddDays(1);
HttpContext.Response.Cookies.Append("setCookieExpires", "CookieValueExpires", options);
}
/// <summary>
/// 根據(jù)key獲取Cookie的Value值
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetCookie")]
public string GetCookid()
{
return HttpContext.Request.Cookies["setCookie"];
}
/// <summary>
/// 根據(jù)key刪除Cookie
/// </summary>
[HttpGet]
[Route("DeleteCookie")]
public void DeleteCookie()
{
HttpContext.Response.Cookies.Delete("setCookie");
}
}
}運(yùn)行程序,我們看查看獲取Cookie的效果:

接下來(lái)我們?cè)L問(wèn)刪除Cookie的方法:
可以看到,剛才的Cookie信息已經(jīng)刪除掉了。
2、封裝Cookie
在上面的例子中,我們是訪問(wèn)的HttpContext對(duì)象的Response和Request,然后才能設(shè)置、獲取或刪除Cookie信息。在具體的程序中,我們一般是把Cookie的操作進(jìn)行封裝,我們可以使用IHttpContextAccessor接口訪問(wèn)ASP.NET Core中的HttpContext.HttpContextAccessor類(lèi)實(shí)現(xiàn)此接口。下面我們看一下如何在類(lèi)庫(kù)中操作Cookie。
首先,我們需要注冊(cè)IHttpContextAccessor以進(jìn)行依賴項(xiàng)注入,在Startup類(lèi)的ConfigureServices方法中添加類(lèi)型為HttpContextAccessor的單例服務(wù):
public void ConfigureServices(IServiceCollection services)
{
// 注冊(cè)為單例
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddControllers();
}因?yàn)槲覀兪窃陬?lèi)庫(kù)中使用Cookie,所以需要?jiǎng)?chuàng)建一個(gè)單獨(dú)的類(lèi)庫(kù):

接下來(lái)創(chuàng)建一個(gè)接口,里面封裝Cookie的一些操作:
namespace CookieDemo.Framework
{
public interface ICookieHelper
{
void SetCookie(string key, string value);
void SetCookie(string key, string value, int expiresTime);
string GetCookie(string key);
void DeleteCookie(string key);
}
}然后定義一個(gè)具體的實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)ICookieHelper接口:
using Microsoft.AspNetCore.Http;
using System;
namespace CookieDemo.Framework
{
public class CookieHelper : ICookieHelper
{
private readonly IHttpContextAccessor _httpContextAccessor;
/// <summary>
/// 通過(guò)構(gòu)造函數(shù)進(jìn)行注入
/// </summary>
/// <param name="httpContextAccessor"></param>
public CookieHelper(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
/// <summary>
/// 根據(jù)key值刪除對(duì)應(yīng)的Cookie
/// </summary>
/// <param name="key">key值</param>
public void DeleteCookie(string key)
{
_httpContextAccessor.HttpContext.Response.Cookies.Delete(key);
}
/// <summary>
/// 根據(jù)key值獲取Cookie的value值
/// </summary>
/// <param name="key">key值</param>
/// <returns></returns>
public string GetCookie(string key)
{
return _httpContextAccessor.HttpContext.Request.Cookies[key];
}
/// <summary>
/// 設(shè)置Cookie值
/// </summary>
/// <param name="key">key值</param>
/// <param name="value">value值</param>
public void SetCookie(string key, string value)
{
_httpContextAccessor.HttpContext.Response.Cookies.Append(key, value);
}
/// <summary>
/// 設(shè)置Cookie及過(guò)期時(shí)間
/// </summary>
/// <param name="key">key值</param>
/// <param name="value">value值</param>
/// <param name="expiresTime">過(guò)期時(shí)間,以分鐘為單位</param>
public void SetCookie(string key, string value, int expiresTime)
{
CookieOptions options = new CookieOptions()
{
Expires = DateTime.Now.AddMinutes(expiresTime)
};
_httpContextAccessor.HttpContext.Response.Cookies.Append(key, value,options);
}
}
}最后我們還需要在Startup的ConfigureServices方法里面注入:
public void ConfigureServices(IServiceCollection services)
{
// 注冊(cè)為單例
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
// 注冊(cè)Cookie操作接口
services.AddSingleton<ICookieHelper, CookieHelper>();
services.AddControllers();
}在添加一個(gè)控制器訪問(wèn)Cookie:
using CookieDemo.Framework;
using Microsoft.AspNetCore.Mvc;
namespace CookieDemo.Controllers
{
[Route("api/CookieHelperTest")]
[ApiController]
public class CookieHelperTestController : ControllerBase
{
private readonly ICookieHelper _helper;
public CookieHelperTestController(ICookieHelper helper)
{
_helper = helper;
}
/// <summary>
/// 設(shè)置Cookie
/// </summary>
[HttpGet]
[Route("SetCookie")]
public void Get()
{
_helper.SetCookie("cookieHelperKey", "cookieHelperValue");
// 設(shè)置過(guò)期時(shí)間
_helper.SetCookie("cookieHelperExpiresKey", "cookieHelperExpitesValue",10);
}
/// <summary>
/// 根據(jù)key獲取Cookie的Value值
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetCookie")]
public string GetCookid()
{
return _helper.GetCookie("cookieHelperKey");
}
/// <summary>
/// 根據(jù)key刪除Cookie
/// </summary>
[HttpGet]
[Route("DeleteCookie")]
public void DeleteCookie()
{
_helper.DeleteCookie("cookieHelperKey");
}
}
}運(yùn)行程序,首先訪問(wèn)設(shè)置Cookie的方法:

可以看到,已經(jīng)我們?cè)O(shè)置的Cookie信息了。
接下來(lái)訪問(wèn)獲取Cookie:

可以根據(jù)key獲取到對(duì)應(yīng)的value值。
最后訪問(wèn)刪除Cookie:

可以看到,key對(duì)應(yīng)的cookie已經(jīng)被刪除了。
GitHub源碼地址:https://github.com/jxl1024/Cookie
到此這篇關(guān)于ASP.NET Core在WebApi項(xiàng)目中使用Cookie的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET Core使用HttpClient調(diào)用WebService
- ASP.NET?Core項(xiàng)目中調(diào)用WebService的方法
- 創(chuàng)建ASP.NET?Core?Web應(yīng)用程序并介紹項(xiàng)目模板
- ASP.NET?Core命名空間System.Text.Encodings.Web介紹
- asp.net core webapi文件上傳功能的實(shí)現(xiàn)
- 在IIS上部署ASP.NET Core Web API的方法步驟
- ASP.NET Core實(shí)現(xiàn)自定義WebApi模型驗(yàn)證詳解
- ASP.NET Core Web中使用AutoMapper進(jìn)行對(duì)象映射
相關(guān)文章
ASP.NET設(shè)計(jì)網(wǎng)絡(luò)硬盤(pán)之刪除文件夾實(shí)現(xiàn)代碼
對(duì)于不再需要的文件/文件夾用戶有權(quán)限做刪除處理。這一節(jié)就介紹如何實(shí)現(xiàn)這一功能2012-10-10
ASP.net 驗(yàn)證碼實(shí)現(xiàn)代碼(C#)
asp.net 驗(yàn)證碼效果實(shí)現(xiàn)代碼2008-02-02
Server Application Unavailable出現(xiàn)的原因及解決方案小結(jié)
今天在服務(wù)器安裝了個(gè).net 4.0 framework(原本有1.0和2.0的),配置好站點(diǎn)后,選擇版本為4.0,訪問(wèn)出錯(cuò),asp.net經(jīng)常會(huì)出現(xiàn)這個(gè)問(wèn)題,這里腳本之家簡(jiǎn)單的給整理下2012-05-05
asp.net中如何批量導(dǎo)出access某表內(nèi)容到word文檔
最近有項(xiàng)目需求是這樣的,需要將某表中的每一條記錄中的某些內(nèi)容導(dǎo)出在一個(gè)word文檔中。下面小編就把我的解決辦法分享給大家,供大家參考2015-10-10
asp.net 簡(jiǎn)單工廠模式和工廠方法模式之論述
簡(jiǎn)單工廠模式的最大優(yōu)點(diǎn)在于工廠類(lèi)中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動(dòng)態(tài)實(shí)例化相關(guān)的類(lèi),對(duì)于客戶端來(lái)說(shuō),去除了于具體產(chǎn)品的依賴2011-12-12

