C# ASP.NET Core Web API Redis チュートリアル (2)

前回の記事: C# ASP.NET Core Web
API Identity Authorization (JWT) の検証 (1)からの続きです。

Redis サービスの構築については特に言う必要はありません。自分で行うことができます。Xiaopi (phpstudy) は Windows プラットフォームに使用され、pagoda は Linux プラットフォームに使用され、構築するのに非常に便利です。

 プロジェクトを右クリックし、[NuGet パッケージの管理] を選択して、StackExchange.Redis を追加します。

 appsettings.json 構成ファイルを開き、次の構成を追加します。

  "Redis": {
    "Default": {
      "Connection": "127.0.0.1:6379,password=d0d493hGlqePd2Tn", //redis连接地址,端口号,密码
      "InstanceName": "local", //实例名
      "DefaultDB": "8" //Db8数据库
    }
  }

 RedisHelper.cs クラスを Common フォルダーに追加します。

 完全なコードは次のとおりです。

using StackExchange.Redis;
using System.Collections.Concurrent;

namespace TestApi.Common
{
    /// <summary>
    /// redis类
    /// </summary>
    public class RedisHelper : IDisposable
    {
        //连接字符串
        private string _connectionString;
        //实例名称
        private string _instanceName;
        //默认数据库
        private int _defaultDB;

        private ConcurrentDictionary<string, ConnectionMultiplexer> _connections;
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="instanceName"></param>
        /// <param name="defaultDB"></param>
        public RedisHelper(string connectionString, string instanceName, int defaultDB = 0)
        {
            _connectionString = connectionString;
            _instanceName = instanceName;
            _defaultDB = defaultDB;
            _connections = new ConcurrentDictionary<string, ConnectionMultiplexer>();
        }

        /// <summary>
        /// 获取ConnectionMultiplexer
        /// </summary>
        /// <returns></returns>
        private ConnectionMultiplexer GetConnect()
        {
            return _connections.GetOrAdd(_instanceName, p => ConnectionMultiplexer.Connect(_connectionString));
        }

        /// <summary>
        /// 获取redis数据库
        /// </summary>
        /// <returns></returns>
        public IDatabase GetDatabase()
        {
            return GetConnect().GetDatabase(_defaultDB);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="configName"></param>
        /// <param name="endPointsIndex"></param>
        /// <returns></returns>
        public IServer GetServer(string? configName = null, int endPointsIndex = 0)
        {
            var confOption = ConfigurationOptions.Parse(_connectionString);
            return GetConnect().GetServer(confOption.EndPoints[endPointsIndex]);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="configName"></param>
        /// <returns></returns>
        public ISubscriber GetSubscriber(string? configName = null)
        {
            return GetConnect().GetSubscriber();
        }
        /// <summary>
        /// 
        /// </summary>
        public void Dispose()
        {
            if (_connections != null && _connections.Count > 0)
            {
                foreach (var item in _connections.Values)
                {
                    item.Close();
                }
            }
        }
    }
}

 Program.cs クラスにサービスの依存関係を追加する

#region 配置Redis 
// 配置Redis   注入类似于配置数据库连接字符串
var section = builder.Configuration.GetSection("Redis:Default");
// 连接字符串
string _connectionString = section.GetSection("Connection").Value;
// 实例名称
string _instanceName = section.GetSection("InstanceName").Value;
// 默认数据库 
int _defaultDB = int.Parse(section.GetSection("DefaultDB").Value ?? "0");
builder.Services.AddSingleton(new RedisHelper(_connectionString, _instanceName, _defaultDB));
#endregion

テスト使用、コントローラー インターフェイスでの使用、UserInfoController.cs を開きます。

次のコードを追加します。

 完全なコード:

using Microsoft.AspNetCore.Mvc;
using TestApi.Common;
using TestApi.Models;

namespace TestApi.Controllers
{
    [Route("[controller]/[action]")]
    [ApiController]
    public class UserInfoController : ControllerBase
    {
        private readonly JwtHelper _jwt;

        private readonly RedisHelper _redis;
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="jwtHelper"></param>
        public UserInfoController(JwtHelper jwtHelper, RedisHelper redis)
        {
            _jwt = jwtHelper;
            _redis = redis;
        }
        /// <summary>
        /// 获取Token
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetToken(UserInfo user)
        {
            //参数验证等等....
            if (string.IsNullOrEmpty(user.UserName))
            {
                return Ok("参数异常!");
            }
            //这里可以连接mysql数据库做账号密码验证


            //这里可以做Redis缓存验证等等
            _redis.GetDatabase().StringSet("Name", user.UserName);// 往Redis里面存入数据
            string name = _redis.GetDatabase().StringGet("Name");// 从Redis里面取数据

            //这里获取Token,当然,这里也可以选择传结构体过去
            var token = _jwt.CreateToken(user.UserName, user.PhoneNumber);
            return Ok(token);
        }
        /// <summary>
        /// 获取自己的详细信息,其中 [Authorize] 就表示要带Token才行
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [Authorize]
        public IActionResult GetSelfInfo()
        {
            //执行到这里,就表示已经验证授权通过了
            /*
             * 这里返回个人信息有两种方式
             * 第一种:从Header中的Token信息反向解析出用户账号,再从数据库中查找返回
             * 第二种:从Header中的Token信息反向解析出用户账号信息直接返回,当然,在前面创建Token时,要保存进使用到的Claims中。
            */
            return Ok("授权通过了!");
        }
    }
}

次に、F5 キーを押してテストを実行します。

次の記事では、MySQL の使用法を紹介します。

C# ASP.NET Core Web API MySQL チュートリアル (3) - プログラマー募集 

おすすめ

転載: blog.csdn.net/u012402739/article/details/128465931