<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      目錄

      * 前言 <https://www.cnblogs.com/AprilBlank/p/11282349.html#前言>
      * Cache <https://www.cnblogs.com/AprilBlank/p/11282349.html#cache>
      * Session <https://www.cnblogs.com/AprilBlank/p/11282349.html#session>
      * Cookie <https://www.cnblogs.com/AprilBlank/p/11282349.html#cookie>
      * 小結 <https://www.cnblogs.com/AprilBlank/p/11282349.html#小結>
      * 補充 <https://www.cnblogs.com/AprilBlank/p/11282349.html#補充>
      前言


      作為WebApi接口工程,性能效率是必不可少的,每次的訪問請求,數(shù)據(jù)庫讀取,業(yè)務邏輯處理都或多或少耗費時間,偶爾再來個各種花式for循環(huán),那就嗨翻天了,一些公有的數(shù)據(jù),訪問頻繁且大致重復的數(shù)據(jù),我們可以考慮通過緩存來放置內存存儲,以內存空間換取時間上的提升,至于緩存的方法,
      Cache,Session,Cookie等,為什么用等呢,因為還有很多緩存的方法,如Redis,具體后面用到了會專門介紹。

      Cache

      net core中沒有Cache,但是它有MemoryCache,其實,大差不差,畢竟都是Cache。

      Cache在項目工程中使用的范圍還是挺廣泛的:

      * 在個人開發(fā)的時候,我一般會把系統(tǒng)字典做緩存,方便調用提高響應速度
      * 消息推送后,會把消息實體緩存
      * 其他,自己看著辦吧
      首先,引入Microsoft.Extensions.Caching.Memory


      這里我直接在Util引入,前面已經(jīng)講了,一個工程引入第三方,其他工程引入項目工程即可使用對應第三方類庫。
      引入完成后,我們就開始來使用這個MemoryCache吧。
      //實例化 private static readonly MemoryCache Cache = new MemoryCache(new
      MemoryCacheOptions()); /// <summary> /// 添加緩存 /// </summary> /// <param
      name="key">緩存Key</param> /// <param name="value">緩存Value</param> /// <param
      name="expiresSliding">滑動過期時長(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> /// <param
      name="expiressAbsoulte">絕對過期時長</param> /// <returns></returns> public static
      bool Set(string key, object value, TimeSpan expiresSliding, TimeSpan
      expiressAbsoulte) { if (key == null) throw new
      ArgumentNullException(nameof(key)); if (value == null) throw new
      ArgumentNullException(nameof(value)); Cache.Set(key, value, new
      MemoryCacheEntryOptions().SetSlidingExpiration(expiresSliding)
      .SetAbsoluteExpiration(expiressAbsoulte)); return Exists(key); } /// <summary>
      /// 添加緩存 /// </summary> /// <param name="key">緩存Key</param> /// <param
      name="value">緩存Value</param> /// <param name="expiresIn">緩存時長</param> ///
      <param name="isSliding">是否滑動過期(如果在過期時間內有操作,則以當前時間點延長過期時間)</param> ///
      <returns></returns> public static bool Set(string key, object value, TimeSpan
      expiresIn, bool isSliding = false) { if (key == null) throw new
      ArgumentNullException(nameof(key)); if (value == null) throw new
      ArgumentNullException(nameof(value)); Cache.Set(key, value, isSliding ? new
      MemoryCacheEntryOptions().SetSlidingExpiration(expiresIn) : new
      MemoryCacheEntryOptions().SetAbsoluteExpiration(expiresIn)); return
      Exists(key); }

      這個地方大致列下如何使用,其實對于第三方的包,我們封裝是為了減少其他開發(fā)人員的學習成本,后面的SqlSugar等類庫一樣,其實本身第三方已經(jīng)做了一次封裝整合,而我們是因為實際開發(fā)需要來針對不同的業(yè)務功能做不同的封裝整合,接口開放等。

      補個測試效果,寫到Session才想起來,唉,果然寫東西不能讓打斷,-,-||。




      注意觀察時間,一段時間后Cache過期銷毀。



      Session

      最初鼓搗net
      core的時候,我確實沒有過多關注Session這個會話模式,畢竟只有瀏覽器才能使用,之前跟別人談到Session多爽的時候,說道Session其實本質上類似Cookie(當然我也不清楚),因為用戶訪問后會有個SessionID,有狀態(tài)的訪問會留下Cookie也是情有可原的,如果用戶自己整個隱私模式訪問,那,再見(你就在登錄界面循環(huán)往復吧)。

      在用戶登錄后,Session存儲用戶基本登錄信息這個是web端常用的手段,畢竟跟瀏覽器打交道Cookie少不了,對于無狀態(tài)訪問授權的JWT
      <https://jwt.io/>
      也是折騰過,不過還是理解不透徹,統(tǒng)一的授發(fā)token的方式還是挺可取的,如果是多服務,多應用,負載均衡的場景,單點登錄確實方便,但是我常規(guī)會自己生成token來通過Session或者Redis存儲,實際效果應該是差不多吧。
      好了,廢話不多說,一樣是引入Microsoft.AspNetCore.Session


      引入完成后,在Startup.cs注冊Session服務。
      public void ConfigureServices(IServiceCollection services) { //…之前的代碼 #region
      Session services.AddSession(options => { options.Cookie.Name = "April.Session";
      options.IdleTimeout = TimeSpan.FromSeconds(2000);//設置session的過期時間
      options.Cookie.HttpOnly = true;//設置在瀏覽器不能通過js獲得該cookie的值,實際場景根據(jù)自身需要 });
      #endregion }
      注冊服務后,需要在ConfigConfigure使用,注意所有的Use要在UserMvc之前才能生效。
      public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
      //…之前的代碼 app.UseSession();//這里使用 app.UseHttpsRedirection(); app.UseMvc(); }
      在Util創(chuàng)建一個SessionUtil,來封裝Session方法,這里只簡單描述下如何使用,后續(xù)代碼開源后可查看源碼使用。
      public class SessionUtil { /// <summary> /// 設置Session /// </summary> ///
      <param name="key">鍵</param> /// <param name="value">值</param> public void
      SetSession(HttpContext content,string key, string value) {
      content.Session.SetString(key, value); } /// <summary> /// 獲取Session ///
      </summary> /// <param name="key">鍵</param> /// <returns>返回對應的值</returns> public
      string GetSession(HttpContext context, string key, string defaultValue = "") {
      string value = context.Session.GetString(key); if (string.IsNullOrEmpty(value))
      { value = defaultValue; } return value; } }
      我們依然拿這個萬惡的ValuesController開刀。


      運行后,訪問這個Values/{id}接口,發(fā)現(xiàn)我們的Session值已經(jīng)獲取到了。



      HttpContext這個對象,可以通過IServiceProvider來獲取,這樣方便調用統(tǒng)一維護。
      新建AprilConfig類文件,代碼如下:
      public class AprilConfig { public static IServiceProvider _provider; public
      static HttpContext HttpCurrent { get { object factory =
      _provider.GetService(typeof(IHttpContextAccessor)); HttpContext context =
      ((IHttpContextAccessor)factory).HttpContext; return context; } } }
      寫好后我們需要回到Startup.cs,給IserviceProvider賦值。


      SessionUtil代碼修改調整,不需要再傳HttpContext這個參數(shù)。


      這樣少傳一個是一個,后續(xù)用到HttpContext這個上下文的時候,也不用考慮啥了,直接AprilConfig.HttpCurrent走起。

      Cookie


      Cookie在web開發(fā)使用的還是相當頻繁的,畢竟不占用服務器內存,跟服務器基本上沒半毛錢關系,客戶端的內存想咋折騰咋折騰,客戶端的資源想咋使用咋使用(ps:這就是為啥你的電腦越來越卡,軟件開發(fā)不考慮性能優(yōu)化的種種結果)。

      Cookie本身在net core中已經(jīng)支持,所以不需要引入啥NuGet包。

      新建CookieUtil(不要吐槽我的命名方法,習慣了)。
      public class CookieUtil { /// <summary> /// 設置本地cookie /// </summary> ///
      <param name="key">鍵</param> /// <param name="value">值</param> /// <param
      name="minutes">過期時長,單位:分鐘</param> public static void SetCookies(string key,
      string value, int minutes = 10) {
      AprilConfig.HttpCurrent.Response.Cookies.Append(key, value, new CookieOptions {
      Expires = DateTime.Now.AddMinutes(minutes) }); } /// <summary> /// 刪除指定的cookie
      /// </summary> /// <param name="key">鍵</param> public static void
      DeleteCookies(string key) { //這個地方想判斷就判斷下,不過內部封裝的方法應該是已經(jīng)做過處理
      AprilConfig.HttpCurrent.Response.Cookies.Delete(key); } /// <summary> ///
      獲取cookies /// </summary> /// <param name="key">鍵</param> ///
      <returns>返回對應的值</returns> public static string GetCookies(string key,string
      defaultValue="") { string value = string.Empty;
      AprilConfig.HttpCurrent.Request.Cookies.TryGetValue(key, out value); if
      (string.IsNullOrEmpty(value)) { value = defaultValue; } return value; } }
      寫好之后,老規(guī)矩ValuesController走一波。


      測試結果:



      小結

      從創(chuàng)建工程到在線文檔,日志管理,緩存機制基本上走了一遍了,下一步,就是數(shù)據(jù)層的操作,一個工程管理肯定少不了數(shù)據(jù)的支撐,總不能每次都自己YY數(shù)據(jù)吧,下一節(jié),
      數(shù)據(jù)庫操作。

      補充

      針對Session.SetString的方法沒有問題,需要引入一個NuGet包,這個里面包含官方的擴展方法,
      Microsoft.AspNetCore.Http.Abstractions。

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          让你叫到爽视频在线观看 | 多浓精宫交h再深点太舒服了 | 人人爽人人爽人人片av免 | 超碰在线青娱乐 | 污污视频免费观看 | 欧美成人大香蕉 | www.日逼 | 天天有好逼 | 日韩性爱视频无码 | 双乳饱满少妇吃奶呻吟视频 |