【问题标题】:File.WriteAllText and IIS concurrent accessFile.WriteAllText 和 IIS 并发访问
【发布时间】:2012-07-21 06:25:12
【问题描述】:

我每 10 分钟将一个 200k JSON 文件从控制台应用程序写入 IIS 框的 Web 文件夹。移动客户端会定期通过 IIS 从该文件中获取数据。

想知道如果 IIS 在写入文件时命中文件会发生什么。 This 问题说 File.WriteAllText 使用 FileShare.Read - 所以有人可以在写入时阅读它。

我将用一个大文件对此进行测试,看看 IIS 在写入过程中如何处理请求。我记得 UNIX 中的一个技巧是写入版本文件 json.201207231033 并将符号链接更新为 json

其他人有这方面的经验吗?

【问题讨论】:

  • 答案是,如果你真的想避免任何问题,你应该在写入文件时锁定文件。 stackoverflow.com/a/6805806/101827
  • 如果 IIS 遇到一个被锁定的文件,它会做什么?服务下降一些 400 错误?那并不理想
  • 我们谈论的是两种不同类型的锁定。我说的是mutual-exclusionlock,您可以在写入时使用它来临时阻止检索,这不会对您的客户造成错误。如果他们直接检索它,您可能需要在您的客户端和文件之间实现一个层。
  • 我可以看到混乱在哪里。我正在从控制台应用程序编写 json 文件。更新了我的问题。
  • 老实说,这是在网络上发布数据的一种非常奇怪的方式。大多数 Web 应用程序根据请求在 Web 服务器上执行代码,然后执行并检索新数据。为什么要这样设计?

标签: c# iis concurrency


【解决方案1】:

以下是我将如何使用 ASP.NET 页面中的以下伪代码来解决您的问题。您要将结果缓存在内存中,并在数据在缓存中超过 10 分钟时刷新数据。

    var data = Cache["data"];
    if (data.Timestamp <= 
        DateTime.Now.Substract(TimeSpan.FromMinutes(10)))
    {
            //Refresh cache with new data when it's older than 10min.
            // You could hypothetically do this in a separate thread
            // if you wanted to do so.      
            data = new Data(GetFromDb(), timestamp);
            Cache["data"] = data;

            return Cache["data"];
    }
    else
    {
            //Use existing data
            return Cache["data"];
    }            

这里是关于如何使用 IIS 的 runtime cache 的参考。

如果您想确保您的缓存值始终是最新的,您可以创建一个每 10 分钟访问一次此页面的作业,而不是当前解决方案的方法。

还有很多其他方法可以处理 caching 数据,但使用 OS 文件系统并不是最佳选择。

【讨论】:

  • 有兴趣了解如何从另一个线程更新缓存。添加计划任务每​​ 10 分钟命中一次的路由 /UpdateCache?或让控制台应用程序/网站使用 4.0 System.Runtime.Caching 类。会解决的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2011-11-29
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多