C# 在云中跨计算机维护数据

C# 在云中跨计算机维护数据,c#,cloud,persistence,C#,Cloud,Persistence,我正在开发一个云托管的ZipFile创建服务 这是一个跨源WebApi2服务,用于从无法承载任何服务器端代码的文件系统提供ZipFile 基本操作如下所示: 用户使用与文件位置相关的URL的字符串[]发出POST请求 WebApi将数组读入内存,并创建票证号 WebApi将票证号返回给用户 然后,AJAX回调将用户重定向到附加票证号的web地址,这将在HttpResponseMessage 为了处理票证系统,我的设计方法是建立一个全局字典,将随机生成的10位数字与列表值配对,并将字典与队列配

我正在开发一个云托管的ZipFile创建服务

这是一个跨源WebApi2服务,用于从无法承载任何服务器端代码的文件系统提供ZipFile

基本操作如下所示:

  • 用户使用与文件位置相关的URL的
    字符串[]
    发出POST请求
  • WebApi将数组读入内存,并创建票证号
  • WebApi将票证号返回给用户
  • 然后,AJAX回调将用户重定向到附加票证号的web地址,这将在
    HttpResponseMessage
为了处理票证系统,我的设计方法是建立一个全局字典,将随机生成的10位数字与
列表
值配对,并将字典与
队列
配对,一次存储10000个条目。([此处参考][1])

部分原因是WebApi不支持缓存

当我在本地调用AJAX时,它100%都能正常工作。当我远程打电话时,大约20%的时间都能正常工作

当它失败时,我得到的错误是:

字典中不存在给定的密钥。

也就是说,在全局字典对象中找不到票证号

我们(在Stack的帮助下)将问题追踪到云中的多个服务器。

在这种情况下,有三种

这并不意味着有三分之一的机会可以成功,现在的情况似乎是这样的:

  • 当浏览器位于云站点时进行的调用在100%的时间内工作,因为同一台机器端到端地处理整个操作
  • 从其他站点发出的调用的工作频率要低得多,因为接受AJAX调用的机器与随后重定向到网站下载文件的机器之间没有连续性。如果同一台机器同时处理这两个问题,那就很幸运了
现在,我确信我们可以创建一个数据库来处理请求,但要维护这些机器之间的状态,似乎需要做更多的工作


这些机器是否有任何非数据库方式在所有会话中维护相同的
字典
,而不需要设置第四台机器来处理队列?

如果您的ASP.NET web应用程序使用会话状态,您将需要配置外部会话状态提供程序(Redis缓存服务或SQL Server会话状态提供程序)


这里有一个循序渐进的指南。

这就是字典只包含一个操作队列的原因吗

看来你要么需要:

  • 托管队列的第三台计算机(尽管您反对)。如果您使用Azure,一个明显的选择可能是分布式Azure缓存服务
  • 忘记字典,只使用服务器包并交付请求的结果,可能是在异步操作中