.Net Core笔记知识点(跨域、缓存)

设置前端跨域配置示例:

复制代码
builder.Services.AddCors(option => {

    option.AddDefaultPolicy(policy => {
        policy.WithOrigins(originUrls).AllowAnyMethod().AllowAnyHeader().AllowCredentials();
    });

});

var app = builder.Build();

app.UseCors();

【客户端缓存】接口缓存

对需要设置缓存的控制器加上ResponseCacheAttribute属性,Asp.Net Core会自动添加cache-control报文头,效果如下:20秒内的二次请求将直接获取头第一次的返回的值

复制代码
 [ResponseCache(Duration =20)]
 [HttpGet("api/[controller]/[action]")]
 public IActionResult GetModel()
 {
  

     return Json();
 }

【服务器端缓存】响应缓存中间件

用法:在app.MapController之前加上app.UseReonseCaching()。确保app.UseCors写到app.UseReonseCaching()前。

注:不使用app.UseReonseCaching()时,不同浏览器请求到的是不同的缓存;启用后,请求到的是同一缓存。

如果浏览器禁用缓存,这个缓存机制是无法生效的,客户端缓存与服务器端缓存都无法生效

缺陷:无法应对恶意请求给服务器带来的压力(使用无缓存请求);有限制:只能响应状态码200的Get或者HEAD响应,报文头中不能含有Authoration、Set-Cookies

【内存缓存】

用法:builder.service.AddMemoryCache();注入IMemoryCache接口

复制代码
private readonly IMemoryCache _memoryCache;

public TestController(IMemoryCache memoryCache)
{
    _memoryCache = memoryCache;
}

[ResponseCache(Duration = 20)]
[HttpGet]
public IActionResult GetModel()
{
     var data = _memoryCache.GetOrCreateAsync<LoginDto>("loginData", async (e) =>
     {

     //获取不到时,从回调方法中获取并设置缓存
     var model = new LoginDto();

     //设置缓存策略,绝对过期机制,10分钟后过期
     e.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10);

     //滑动过期机制,在缓存生效前,只要请求数据,就会重置过期时间
     e.SlidingExpiration = TimeSpan.FromMinutes(10);

     return model;
     });

    return Json(new { code = 0, msg = "" });
}

绝对过期机制和滑动过期机制可以一起混合使用,绝对过期时间需要长于滑动过期时间,有利于数据刷新。

【缓存穿透】

恶意请求无效数据,导致缓存机制中请求数据库访问变多,造成服务器压力变大。

方案1:使用GetOrCreateAsync,将返回的null值也作为缓存数据。

【缓存雪崩】

缓存项集中过期导致服务器访问压力过大

方案1:在基础过期时间之上,再加上随机过期时间。

【分布式缓存】

为避免服务器集群部署时分别请求服务器再缓存数据到内存,会造成服务器压力过大。

方案1:引入缓存服务器,集群部署的服务器直接请求缓存服务器。

.Net Core 提供统一的分布式缓存服务器的操作接口IDistributedCache,缓存类型为byte[],需要进行类型转换。

Nuget:Microsoft.Extensions.Caching.StackExchangeRedis

builder.Services.AddStackExchangeRedisCache

相关推荐
DXM05217 分钟前
FME入门系列教程7-基于FME的ArcGIS空间数据互操作技术研究与实践
xml·开发语言·笔记·arcgis·fme·arcgis engine
UQI-LIUWJ13 分钟前
论文略读:If Multi-Agent Debate is the Answer, What is the Question?
论文阅读·笔记
孞㐑¥1 小时前
Linux之Ext系列文件系统(含动静态库)
linux·开发语言·c++·经验分享·笔记
s_little_monster7 小时前
【Linux】网络--传输层--UDP协议
linux·运维·服务器·笔记·学习·udp·学习方法
摆烂..9 小时前
博客摘录「 unity 协程 多线程 进程 纤程 区别和介绍」2025年5月22日
笔记
江沉晚呤时10 小时前
GraphQL在.NET 8中的全面实践指南
microsoft·ui·c#·.net·.netcore·graphql
z人间防沉迷k13 小时前
高效查询:位图、B+树
开发语言·数据结构·笔记·python·算法
尬尬_13 小时前
【计算机网络】TCP如何保障传输可靠性_笔记
服务器·笔记·tcp/ip·计算机网络·考研
孤寂大仙v13 小时前
【Linux笔记】——网络基础
linux·网络·笔记
scdifsn14 小时前
动手学深度学习12.6. 多GPU的简洁实现-笔记&练习(PyTorch)
pytorch·笔记·深度学习