C#文件缓存

C#文件缓存,c#,asp.net,caching,C#,Asp.net,Caching,我有一个方法为“GetNewsFeed”的类,当请求页面时: 检查文件是否存在&文件的时间不足30分钟 如果文件不存在,则读取文件内容,将内容推到页面上 如果不存在,请转到URL并将该页面的内容写入.txt文件,然后将内容推送到页面上 我对C#不是很精通,所以我正试图拼凑一些资料来源。我相信我很接近,但如果需要的话,我无法让文件每30分钟刷新一次(我没有收到任何遵从性错误或任何东西)。任何帮助都将不胜感激 public static string GetNewsFeed(string u

我有一个方法为“GetNewsFeed”的类,当请求页面时:

  • 检查文件是否存在&文件的时间不足30分钟
    • 如果文件不存在,则读取文件内容,将内容推到页面上
    • 如果不存在,请转到URL并将该页面的内容写入.txt文件,然后将内容推送到页面上
我对C#不是很精通,所以我正试图拼凑一些资料来源。我相信我很接近,但如果需要的话,我无法让文件每30分钟刷新一次(我没有收到任何遵从性错误或任何东西)。任何帮助都将不胜感激

public static string GetNewsFeed(string url, string fileName)
{
    // Set the path to the cache file
    String filePath = HttpContext.Current.Server.MapPath("/cachefeed/" + fileName + ".txt");
    string fileContents = "";

    // If the file exists & is less than 30 minutes old, read from the file.
    if (File.Exists(filePath) && (File.GetLastWriteTime(filePath) > DateTime.Now.AddMinutes(-30)))
    {
        fileContents = File.ReadAllText(filePath);
    }

    else
    {
        try
        {
            // If the file is older than 30 minutes, go out and download a fresh copy
            using (var client = new WebClient())
            {
                // Delete and write the file again
                fileContents = client.DownloadString(url);
                File.Delete(filePath);
                File.WriteAllText(filePath, fileContents);
            }
        }

        catch (Exception)
        {
            if (File.Exists(filePath))
            {
                fileContents = File.ReadAllText(filePath);
            }
        }
    }

    return fileContents;
}

最后,我在其他地方有一些代码,可以读取这些文本文件并在页面上处理它们的内容。我对此没有任何问题

很可能,您在else块中捕获到一个异常,它只返回文件内容。尝试在异常块中放置断点以查看发生了什么

您需要将其更改为:

 catch( Exception e )
为了得到这些信息

此外,您不需要这样做:

            File.Delete(filePath);
WriteAllText方法将覆盖已存在的文件。尝试删除该行并检查目录权限

你也可能想要改变

 (File.GetLastWriteTime(filePath) > DateTime.Now.AddMinutes(-30)))


很可能,您在else块中捕获到一个异常,它只返回文件内容。尝试在异常块中放置断点以查看发生了什么

您需要将其更改为:

 catch( Exception e )
为了得到这些信息

此外,您不需要这样做:

            File.Delete(filePath);
WriteAllText方法将覆盖已存在的文件。尝试删除该行并检查目录权限

你也可能想要改变

 (File.GetLastWriteTime(filePath) > DateTime.Now.AddMinutes(-30)))


我在我的
catch
中添加了一个
throw
,信不信由你,我传递到方法中的一个URL无效。是的,我代码中的罪魁祸首是catch语句

我修复了这个,一切正常


谢谢大家的提示。

我在我的
catch
中添加了一个
throw
,信不信由你,我传递到我的方法中的一个URL无效。是的,我代码中的罪魁祸首是catch语句

我修复了这个,一切正常


谢谢大家的提示。

恐怕有点含糊不清。您是否已在调试中加入此步骤以了解可能出现的问题?可能是日期比较有缺陷?如果下载字符串时出现异常,并且没有文件,则该方法将始终返回空字符串。您也可以使用,并将过期日期设置为30分钟。@NicoSchertler我想问是否有不使用ASP.NET缓存的特定原因。@PhilPursglove除了我不熟悉ASP.NET缓存之外,这不是一个具体的原因。恐怕有点模糊。您是否已在调试中加入此步骤以了解可能出现的问题?可能是日期比较有缺陷?如果下载字符串时出现异常,并且没有文件,则该方法将始终返回空字符串。您也可以使用,并将过期日期设置为30分钟。@NicoSchertler我想问是否有不使用ASP.NET缓存的特定原因。@PhilPursglove除了我不熟悉ASP.NET缓存之外,这不是一个具体的原因。这是有道理的。我修改了你的一些建议;非常感谢。我把一个断点放在接球的大括号上,但没有得到任何错误。我甚至连试都不试;捕捉;块,我仍然要加载我的页面,但它没有更新文件(我还将测试时间从30分钟改为1分钟)。有什么想法吗?在这里放一个断点:File.writealText(filePath,fileContents);文件路径和文件内容是什么?它们是我所期望的(txt文件的路径和JSON对象)。但是txt文件的修改日期没有改变。这是有道理的。我修改了你的一些建议;非常感谢。我把一个断点放在接球的大括号上,但没有得到任何错误。我甚至连试都不试;捕捉;块,我仍然要加载我的页面,但它没有更新文件(我还将测试时间从30分钟改为1分钟)。有什么想法吗?在这里放一个断点:File.writealText(filePath,fileContents);文件路径和文件内容是什么?它们是我所期望的(txt文件的路径和JSON对象)。但是txt文件的修改日期没有改变。