From a77171ac123eee85ec42b36312078bf3ac92197e Mon Sep 17 00:00:00 2001
From: "Vicente.Yu" <^@^>
Date: Fri, 23 Jan 2026 15:03:24 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=BC=82=E5=B8=B8=E6=97=B6=E7=9A=84=E7=BC=93=E5=AD=98=E6=AF=AB?=
=?UTF-8?q?=E7=A7=92=E6=95=B0=20=E5=A2=9E=E5=8A=A0=20=E5=AF=B9=E9=9D=9E=20?=
=?UTF-8?q?GET=20=E8=AF=B7=E6=B1=82=E8=BF=9B=E8=A1=8C=E7=BC=93=E5=AD=98?=
=?UTF-8?q?=E6=97=B6=E9=9C=80=E6=98=BE=E5=BC=8F=E4=BA=8C=E6=AC=A1=E7=A1=AE?=
=?UTF-8?q?=E8=AE=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../CacheAttributes/CacheAttribute.cs | 90 ++++++++++++++++++-
1 file changed, 89 insertions(+), 1 deletion(-)
diff --git a/WebApiClientCore/Attributes/CacheAttributes/CacheAttribute.cs b/WebApiClientCore/Attributes/CacheAttributes/CacheAttribute.cs
index 8beadcc1..273dfd7f 100644
--- a/WebApiClientCore/Attributes/CacheAttributes/CacheAttribute.cs
+++ b/WebApiClientCore/Attributes/CacheAttributes/CacheAttribute.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using System.Net;
+using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using WebApiClientCore.Exceptions;
@@ -14,6 +16,26 @@ namespace WebApiClientCore.Attributes
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class CacheAttribute : ApiCacheAttribute
{
+ ///
+ /// 非200响应时的缓存毫秒数(默认3秒,设为0则不缓存)
+ ///
+ public double ErrorExpiration { get; set; }
+
+ ///
+ /// 是否允许对非 GET 请求进行缓存(默认为 false,需显式二次确认)
+ ///
+ public bool EnableNonGet { get; set; }
+
+ ///
+ /// 用于在运行时存储动态计算的过期时间
+ ///
+ private TimeSpan? _dynamicExpiration;
+
+ ///
+ /// 重写 Expiration 属性,使其能返回动态调整后的值
+ ///
+ public new TimeSpan Expiration => _dynamicExpiration ?? base.Expiration;
+
///
/// 缓存键的请求头名称
///
@@ -38,9 +60,75 @@ public string? IncludeHeaders
/// 使用缓存的特性
///
/// 缓存毫秒数
- public CacheAttribute(double expiration)
+ /// 接口异常时 缓存毫秒数,默认:3秒
+ /// 是否允许对非 GET 请求进行缓存
+ public CacheAttribute(double expiration, double errorExpiration = 3000, bool eableNonGet = false)
: base(expiration)
{
+ this.ErrorExpiration = errorExpiration;
+ this.EnableNonGet = eableNonGet;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override CachePolicy GetWritePolicy(ApiRequestContext context)
+ {
+ var request = context.HttpContext.RequestMessage;
+ var response = context.HttpContext.ResponseMessage;
+
+ // 判断是否为非 GET 方法
+ if (request.Method != HttpMethod.Get)
+ {
+ if (!this.EnableNonGet)
+ {
+ // 输出请求路径和方法,提醒开发者该非GET请求已被跳过缓存
+ Console.WriteLine($"[WARN] Cache Ignored: Method {request.Method} on {request.RequestUri} requires 'EnableNonGet=true'.");
+ return CachePolicy.Ignore;
+ }
+ else
+ {
+ // 表示这是特殊处理的非GET缓存
+ Console.WriteLine($"[INFO] Cache Enabled for Non-GET: {request.RequestUri}");
+ }
+ }
+
+ // 接口升级/异常状态(非 200)
+ if (response != null && response.StatusCode != HttpStatusCode.OK)
+ {
+ if (this.ErrorExpiration <= 0)
+ {
+ return CachePolicy.Ignore;
+ }
+
+ // 动态记录短缓存时间
+ _dynamicExpiration = TimeSpan.FromMilliseconds(this.ErrorExpiration);
+ return CachePolicy.Include;
+ }
+
+ // 200 OK 正常情况
+ _dynamicExpiration = null; // 恢复使用 base.Expiration
+ return CachePolicy.Include;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override CachePolicy GetReadPolicy(ApiRequestContext context)
+ {
+ var request = context.HttpContext.RequestMessage;
+ // 如果不是 GET 且没有明确开启非GET支持
+ if (request.Method != HttpMethod.Get && !this.EnableNonGet)
+ {
+ // 跳过之前的缓存
+ Console.WriteLine($"[WARN] Cache Ignored: Method {request.Method} on {request.RequestUri} requires 'EnableNonGet=true'.");
+ return CachePolicy.Ignore;
+ }
+ return CachePolicy.Include;
}
///
From 0e0d59f737ca957e9f370e63860ad52a337f2afc Mon Sep 17 00:00:00 2001
From: "Vicente.Yu" <^@^>
Date: Fri, 23 Jan 2026 15:10:08 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8B=BC=E5=86=99?=
=?UTF-8?q?=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Attributes/CacheAttributes/CacheAttribute.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/WebApiClientCore/Attributes/CacheAttributes/CacheAttribute.cs b/WebApiClientCore/Attributes/CacheAttributes/CacheAttribute.cs
index 273dfd7f..aa92ca30 100644
--- a/WebApiClientCore/Attributes/CacheAttributes/CacheAttribute.cs
+++ b/WebApiClientCore/Attributes/CacheAttributes/CacheAttribute.cs
@@ -61,12 +61,12 @@ public string? IncludeHeaders
///
/// 缓存毫秒数
/// 接口异常时 缓存毫秒数,默认:3秒
- /// 是否允许对非 GET 请求进行缓存
- public CacheAttribute(double expiration, double errorExpiration = 3000, bool eableNonGet = false)
+ /// 是否允许对非 GET 请求进行缓存
+ public CacheAttribute(double expiration, double errorExpiration = 3000, bool enableNonGet = false)
: base(expiration)
{
this.ErrorExpiration = errorExpiration;
- this.EnableNonGet = eableNonGet;
+ this.EnableNonGet = enableNonGet;
}
///