2

我目前正在开发一个网站,但无法找到正确的解决方案。

当我从另一个浏览器打开我的网站并尝试同时进行 AJAX 调用时,我收到一个错误,因为两个浏览器都在处理请求。

有没有办法检测服务器当前是否正在执行 AJAX 调用并等到它完成第一个请求后再执行第二个请求?

这是我尝试使用不同浏览器同时发出 ajax 请求时的代码

using (StreamWriter sw = new StreamWriter(hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString() + ".hhp", false))
            {

                sw.WriteLine("[OPTIONS]");
                sw.WriteLine("Compatibility=1.1 or later");
                sw.WriteLine("Compiled file=" + hhpPath + "\\Unpublished\\"+ Name +".chm");  //the file to be converted
                sw.WriteLine("Contents file=" + (hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString()) + ".hhc"); //TOC file
                sw.WriteLine("Default topic=" + "Installing the Prototype Terminal.html");
                sw.WriteLine("Display compile progress=no");
                sw.WriteLine("Index file=" + (hhpPath + "\\Contents\\" + Path.GetFileName(hhpPath).ToString()) + ".hhk"); //index file
                sw.WriteLine("Title=none");
                sw.WriteLine("\r\n[FILES]");
                sw.WriteLine("none");
            }

该错误表明该文件当前正在使用中。

4

3 回答 3

2

它是通过 jQuery 进行的 AJAX 调用这一事实无关紧要。您的问题是:您的网站尝试根据请求以独占方式访问资源(在您的情况下,写入常量文件)。

由于该网站旨在同时为大量客户提供服务,因此您将不可避免地遇到访问问题。

您尝试实现的功能对于网站来说并不典型。您能否描述一下您要解决的问题,以便我们给您更好的建议?

可能的解决方案可以是以下组合:

  • 在每个请求上写入不同的文件
  • (如另一个答案中所建议)优雅地处理文件访问错误:要么等到它空闲,要么返回错误
  • 使用数据库而不是文件系统来写入数据
  • 将此功能限制为特定客户端
  • 完全删除此功能
于 2013-10-21T04:37:21.313 回答
1

当您发出 ajax 请求时,如果文件正在使用中,则无法直接在客户端检测到。您可以在该项目周围放置一个 try catch 并返回 -1(文件锁定)状态 1(成功)或 0(其他一些错误)。

或者尝试以下函数在您的代码之前检查文件是否正在使用并将相关状态返回给 ajax 调用。

  protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;
        Boolean status = false;
        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
            status = false ;
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            status = true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return status;
    }
于 2013-10-21T04:32:56.427 回答
1

您需要在文件中写入内容时锁定文件,如下所示

lock (lockObject) 
{
  var sw = new StreamWriter(fs);
  sw.Write('text');
  sw.Flush();
  sw.Close();
}

请检查链接以获取线程同步。

于 2013-10-21T04:37:59.373 回答