日期:2014-05-16  浏览次数:20869 次

Ajax 并发,导致后台类相互覆盖
情景:有一个windows服务,每隔1秒,就会调用一次ajax请求,参数为xml,方式为post。

  ajax请求的后台方法是解析xml格式的参数。

 
C# code
      protected void GetWorkFlowParams(System.Web.HttpContext context)
        {
            try
            {
                Stream ReceiveStream = context.Request.InputStream;
                StreamReader readStream = new StreamReader(ReceiveStream, Encoding.GetEncoding("utf-8"));
                string s = readStream.ReadToEnd();

                XmlDocument xml = new XmlDocument();
                xml.LoadXml(s);

                //.....解析xml
              } 
       }


问题:a时间点发送了一个请求 Axml , b时间点发送一个请求 Bxml 。
   
  现在发现 Axml 在解析的过程中,b请求了,结果Axml的参数变成Bxml的了。

这种情况要如何避免,如果把后台方法改为单例模式,能否解决?或者有什么别的解决办法。

------解决方案--------------------
你的 GetWorkFlowParams() 是在哪里调用的?为什么用 context 作为参数?

context 有可能是单例(猜的,不确切),如果你有更自然的方法直接得到本次请求的 request 对象,也许能避免这个问题。
------解决方案--------------------
这样就清楚了。。应该是你ajax使用同一个对象的问题。IE浏览器会出现结果覆盖,Firefox浏览器再第一个请求未结束前再使用此对象发送请求会出现错误。具体可以参考这个:firefox下XMLHttpRequest重用时nsIXMLHttpRequest.send发生错误的解决方案


要创建不同的ajax对象
JScript code
function create(){var o=..../*创建ajax对象的代码*/;return o;}
function ajax(xml){
  var o=create();
  //....其他代码
}