如何管理 ASP.NET WebApi2 中的缓存?

2023-11-26

我已经使用 Web API 2 实现了 REST 服务,该服务的实现是为了管理由访问服务的不同客户端创建和加入的不同会话。

会话包含有关应用程序功能访问的信息以及已加入同一会话的参与者的信息。

每个客户端每秒从服务器获取会话信息和访问列表以进行同步。根据访问权限的更改,客户端功能将发生更改(启用/禁用)。

我正在使用 MemoryCache 类在 WebAPI 服务中存储会话信息,如下所示。

public static class SessionManager{
private static object objForLock = new object();
public static List<Session> SessionCollection
{
    get
    {
        lock (objForLock)
        {
            MemoryCache memoryCache = MemoryCache.Default;
            return memoryCache.Get("SessionCollection") as List<Session>;
            // return HttpContext.Current.Application["SessionCollection"] as List<Session>;
        }
    }
    set
    {
        lock (objForLock)
        {
            MemoryCache memoryCache = MemoryCache.Default;
            memoryCache.Add("SessionCollection", value, DateTimeOffset.UtcNow.AddHours(5));
            //HttpContext.Current.Application["SessionCollection"] = value;  
        }
    }
}

}

我的问题是关于缓存行为不一致。

当客户端发送同步调用时,会给出不一致的结果。对于某些请求,客户端会获取正确的数据,而对于某些请求,客户端会在某些请求后获取空数据替代。

我添加了调试器并监视对象的空结果,然后“内存缓存.Get(“SessionCollection”)”也为空。经过一些连续的请求后,它会再次正常。我不明白为什么这个对象不持久。

替代方案,我已经尝试过“HttpContext.Current.Application[“SessionCollection”]”也是,但同样的问题也存在。

我读过关于“应用程序池回收”,它会在特定时间后回收所有缓存。如果我的缓存对象被应用程序池回收回收,那么我怎样才能再次获取这个对象?

请有人可以帮助我摆脱这个问题。提前致谢。


您应该将客户特定信息存储在Session代替Cache. Cache应该适用于整个应用程序(共享)

但是,不建议这样做,因为 Web api 是在考虑 RESTful 的情况下构建的,并且 RESTful 服务应该是无状态的(APIs不缓存状态)。无状态应用程序有很多好处:

  • 减少内存使用
  • 更好的可扩展性:您的应用程序可以更好地扩展。想象一下如果您同时存储数百万客户的信息会发生什么。
  • 在负载平衡场景中更好:每个服务器都可以处理每个客户端而不会丢失状态。
  • 会话过期问题。

如果您想存储客户端状态,无论如何都可以这样做。请尝试以下帖子中的建议:ASP.NET Web API 会话还是其他什么?

一般来说,在 Web 服务器上本地缓存状态是不好的(两者Session和当地的MemoryCache)。缓存丢失可能有多种原因:

  • 应用程序池回收。
  • 负载均衡环境
  • IIS 中的多个工作进程

关于您的要求:

每个客户端从服务器获取会话信息和访问列表 每秒同步的目的。根据访问权限的变化, 客户端功能将更改(启用/禁用)。

我不确定当客户端发送同步调用时是否要立即使用新的访问列表更新其他客户端。如果是这样的话,SignalR将是一个更好的选择。

否则,您可以将更新的访问列表存储在某处(共享缓存甚至数据库中),并在其他客户端重新连接另一个请求时更新它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何管理 ASP.NET WebApi2 中的缓存? 的相关文章

随机推荐

  • 检查 Cocoa 中的两个文件是否相同

    如何在 Cocoa 中有效地检查两个文件是否相同 具有相同的数据 上下文 我正在编写一个程序 该程序接收文件作为输入 输入文件 并将其复制到目录中 如果目录已包含同名文件 同名文件 则仅当同名文件不同时才应使用新名称复制输入文件 您可以使用
  • bash:以块的形式处理文件列表

    那个设定 我有数百个文件 名称类似input0 dat input1 dat input150 dat 我需要使用一些命令来处理cmd 它基本上合并了所有文件的内容 这cmd将输出文件名作为第一个选项 然后是所有输入文件名的列表 cmd o
  • 在没有错误状态的情况下处理 iteratee 库中的异常

    我正在尝试编写一个枚举器来逐行读取文件java io BufferedReader using Scalaz7 的 iteratee 库 目前仅提供一个 非常慢的 枚举器java io Reader 我遇到的问题与我使用过的所有其他 ite
  • 如何以编程方式将 Flex TextArea 的插入符移动到末尾?

    在添加代码中的一些文本后 我试图将 Flex TextArea 中的插入符号移动到末尾 我查看了 TextArea 及其底层 TextField 的参考文档 但似乎没有提供方法来处理此问题 我尝试过的一种方法是将焦点设置到文本区域并调度 K
  • 旋转和裁剪

    我正在使用 PHP 旋转和裁剪图像 但显示黑色边框 我知道您可以更改背景颜色 但我想旋转和裁剪图像以填充整个图像 基本上类似于background size cover 左 CSS 与background size contain 正确的
  • Python 无法找到 lxml 模块

    我前段时间写了一个脚本 其中包含 from lxml import etree 但是 不幸的是它不再起作用了 如有疑问 我检查了安装 sudo apt get install python lxml sudo pip install lxm
  • 如何配置 iText 支持亚洲字符?

    我的 Java 应用程序使用 iText 创建 PDF 有时内容是亚洲的 这是行不通的 亚洲字符不可见 I found iTextAsian jar在iText下载页面上 但不知道如何使用它 目标是使用我最喜欢的字体作为默认字体 但是 当某
  • SignalR 2.0 超时连接

    我正在使用SignalR 但是存在超时问题 几分钟后超时消失 不起作用 我怎么能够在 SignalR 2 0 中设置超时连接 您可以在 Owin Startup 类中使用以下配置 Make long polling connections
  • 使用其他 Observable 过滤 RxJava Observable

    我正在使用 RxAndroid 2 0 1 和 RxJava 2 0 6 我有两个可观察量 一个返回Maybe
  • onClickListener 和 onItemClickListener 之间的区别

    Android ListViews 中的 onClickListener 和 onItemClickListener 有什么区别 这些有哪些不同的实现 ListView 为列表视图的每一行都有一个 Item Click 侦听器 但 onCl
  • Python 和 Selenium - 当带有换行符的 send_keys() 时避免提交表单

    我在用Python 3与硒 我们假设var whatever nelse 我的问题是当我使用elem send keys var 它在之后发送表格 任何 因为换行符 我如何将 whatever nelse 替换为whatever SHIFT
  • GraphHopper 车辆=汽车可以工作,但步行或自行车不起作用

    我对 GraphHopper 路由引擎稳定版本 0 5 有疑问 我可以在使用时获取路线vehicle car 但这失败了bike and foot 这是一个例子在 GraphHopper 地图上步行大约 3 分钟 这会在地图上产生结果 非常
  • 如何重写祖先的嵌套 Material UI 组件的样式?

    我正在使用外部库中的组件 该组件不允许我更改其大部分样式 但我想更改作为材质 ui 按钮的按钮的样式 在检查元素时 它清楚地显示了类MuiButtonBase root MuiIconButton root MuiIconButton co
  • asp.net-mvc:js文件中的剃刀'@'符号

    我有一个 csHtml razor 文件 其中包含一个 javascript 函数 该函数使用 Url ContentAjax URL 内部的 C 函数 我想将该功能移至 js从我的观点引用的文件 问题是 javascript 不 知道 符
  • OpenCv StereoRectify 中矩阵的精确定义

    通常投影矩阵的定义P是 3x4 矩阵 它将点从世界坐标投影到图像 像素坐标 投影矩阵可以分解为 K 具有内在参数的 3x4 相机矩阵 K T 带有外部参数的 4x4 变换矩阵 那么投影矩阵就是P K T OpenCV 的stereoRect
  • 我可以使用 jquery post 来上传图片吗?

    我正在尝试使用 jquery 来提交我的表单 但它不会触发functions php 文件中的任何内容 我需要对 multipart form data 做一些特别的事情吗 我错过了什么吗 HTML
  • iPhone 动画基于输入值(触摸)而不是时间

    对于完全适合动画组方法的动画效果 如下所示布拉德 拉尔森的回答在这里 我需要动画根据输入进行 特别是触摸和检测到的触摸的位置 处理 TouchMoved 并为每次触摸设置元素的位置很容易 但它不像核心动画方法那样平滑 想象一下有凹槽的轨道上
  • Pandas 删除数据框中指定字符后的字符串部分

    我想要一种简单的方法来删除数据框中特定字符之后的字符串部分 这是一个简化的示例 df obs a b c d 0 1 1 23 12 1 2 3 1 2 12 23 13 4 5 5 2 3 21 23 14 4 5 5 我想删除第一个 符
  • 设置 Google Play 游戏服务

    我最近一直在尝试新的 Google Play 游戏服务 我花了一些时间来设置所有内容以使示例项目运行 主要是因为a犯了很多小错误 因此 我写了一个小清单 这样其他人就不必经历同样的结果 开发很有趣 配置则不然 谷歌对此有一个很好的快速入门
  • 如何管理 ASP.NET WebApi2 中的缓存?

    我已经使用 Web API 2 实现了 REST 服务 该服务的实现是为了管理由访问服务的不同客户端创建和加入的不同会话 会话包含有关应用程序功能访问的信息以及已加入同一会话的参与者的信息 每个客户端每秒从服务器获取会话信息和访问列表以进行