关于 xmlHttpRequest 异步访问的问题

coreblood 2009-05-07 10:11:46
在使用xml进行异步访问的时候出现了问题请大家帮忙解释一下。内容如下:
App_Code\AsynHandle.cs

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

using System.Web.SessionState;

/// <summary>
///AsynHandle 的摘要说明
/// </summary>
public class AsynHandle : IHttpAsyncHandler, IRequiresSessionState
{

#region IHttpAsyncHandler 成员

public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
context.Response.ContentType = "text/plain";
System.Diagnostics.Debug.WriteLine("请求到达服务端:" + DateTime.Now.ToLongTimeString());
AlarmAsyncResult asynch = new AlarmAsyncResult(context, cb, extraData);
asynch.StartWork();
return asynch;
}

public void EndProcessRequest(IAsyncResult result)
{
AlarmAsyncResult schemeStateListen = result as AlarmAsyncResult;
try
{
if (schemeStateListen != null && schemeStateListen.ResponseObject != null)
{
if (schemeStateListen.ResponseObject is string)
{
schemeStateListen.HttpContext.Response.Clear();
schemeStateListen.HttpContext.Response.Write(schemeStateListen.ResponseObject);
}
}
schemeStateListen.HttpContext.Response.End();
}
catch
{
//schemeStateListen.HttpContext.Response.Write("<?xml version=\"1.0\" encoding=\"gb2312\"?>\n<Action>\n<Type>DateError</Type>\n<DateTime>" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "</DateTime>\n</Action>");
//schemeStateListen.HttpContext.Response.End();
}
}

#endregion

#region IHttpHandler 成员

public bool IsReusable
{
get { return true; }
}

public void ProcessRequest(HttpContext context)
{
throw new NotImplementedException();
}

#endregion
}

public class AlarmAsyncResult : IAsyncResult
{
private HttpContext _mcontext;
private AsyncCallback _mcallback;
private object _masyncState;
private bool _misCompleted = false;
private object _mresponseObject;
private DateTime StartTime = DateTime.Now;

public AlarmAsyncResult(HttpContext context, AsyncCallback callback, object asyncState)
{
this._mcallback = callback;
this._mcontext = context;
this._masyncState = asyncState;
}

#region IAsyncResult 成员

public object AsyncState
{
get { return _masyncState; }
}

public System.Threading.WaitHandle AsyncWaitHandle
{
get { return null; }
}

public bool CompletedSynchronously
{
get { return false; }
}

public bool IsCompleted
{
get { return _misCompleted; }
}

#endregion

public void StartWork()
{
System.Threading.Thread.Sleep(5000);
ResponseObject = "000000000";
SetCompleted();
}

public HttpContext HttpContext
{
get { return this._mcontext; }
}

public object ResponseObject
{
get { return this._mresponseObject; }
set { this._mresponseObject = value; }
}

internal void SetCompleted()
{
try
{
this._misCompleted = true;
if (_mcallback != null)
{
_mcallback(this);
}
}
catch (Exception Ex)
{
//System.
}
}
}


//web.config

<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
<add verb="*" path="AsynHandle.ashx" type="AsynHandle" validate="false"/>
</httpHandlers>


//调用代码

<script type="text/javascript">

function GetXmlHttpObject()
{
var newReq = null;
if(window.XMLHttpRequest)
{
try
{
newReq = new XMLHttpRequest();
}
catch(e)
{
newReq = false;
}
} else if(window.ActiveXObject)
{
try
{
newReq = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e)
{
try
{
newReq = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e)
{
newReq = false;
}
}
}
return newReq;
}

function SendReq(Data)
{
var req = GetXmlHttpObject(); if (req==null) {return};
var url = "AsynHandle.ashx";
url=url+"?Data=" + Data;
url=url+"&Random="+Math.random();
req.open("GET",url,true);
req.onreadystatechange = function() { onComplete(req) }
req.send(null);
}

function onComplete( xmlHttpR )
{
if( xmlHttpR.readyState==4 )
{
alert( xmlHttpR.responseText );
}
}

function Button1_onclick()
{
SendReq(1);
SendReq(2);
SendReq(3);
SendReq(4);
alert("5");
}

</script>
...全文
370 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
coreblood 2009-05-13
  • 打赏
  • 举报
回复
再问个问题,我什么不能修改自己的回复?如何让在这里发布的代码折叠起来?
gyouyang 2009-05-13
  • 打赏
  • 举报
回复
板凳
coreblood 2009-05-13
  • 打赏
  • 举报
回复
在FireFox浏览器的测试中效果完全相同
需要将测试程序中的
_mOutPut.******
修改为
document.getElementById("_mOutPut").******
ch5201314zt 2009-05-13
  • 打赏
  • 举报
回复
这么长 看了头就晕了
gengxin_914 2009-05-13
  • 打赏
  • 举报
回复
不懂,UP
coreblood 2009-05-13
  • 打赏
  • 举报
回复
谢谢楼上的建议,我倒是真的还没测试过,我现在试下.
coreblood 2009-05-13
  • 打赏
  • 举报
回复
每个做过web应用的开发人员一定都对 Session 不陌生,用户在进入应用到离开应用的这段时间,我们常常把用户特定的一些状态或全局变量保存在 Session 对象中,各种 Web 开发语言或平台都有自己的 Session 实现。关于Session,不用解释太多,需要复习一下的话,就看看国内原创的 Session详解。
在传统的Web开发方式中,如何使用Session就是常常让开发人员加班的主要问题之一。AJAX 作为新兴的Web应用开发理念,风光无限之下,也面对着Session的难题。

最先,Marc Wandschneider 发出了疑问:Troubles with Asynchronous Ajax Requests and PHP Sessions。他提供了一些简单的php代码例子来说明多个异步XMLHttpRequest同时访问操作Session对象的服务端脚本时,可能导致多线程应用的典型问题——竞态条件(Race Condition)。作者无奈的认为这是 one of those problems best solved by avoiding it 。

Harry Fuecks 纠正了前文中的一些疑误,他在AJAX and Session “Race Conditions” 一文中强调:竞态条件不是PHP的问题,而是HTTP协议无状态的特性所致。并将问题深入到两种形式的Ajax应用对比—— HTML++ vs. Client/SOA —— 由客户段还是服务端来管理状态。目前大多数的Ajax应用是HTML++的形式,Session依然由服务端管理,而Client/SOA形式则可能由客户端来承担大部分Session状态管理的工作,但目前看来这样的方式离成熟应用还需要不少努力。

《Ajax in Action》的作者(Eric)在很早也已经意识到了 Session 的问题,他给开发人员提出了一些Session注意事项。其中提到了两个问题:

定时刷新的XMLHttpRequest导致Session永不过期,可能引发的安全隐患。
Eric 的解决建议一来就是如果交互的数据与用户信息无关的话,可用XMLHttpRequest轮询不影响Session的文件类型。二来就是编写自己定义的Session监视机制。
XMLHttpRequest 访问Session已过期的页面,对返回结果的不当处理。
Eric 建议更加仔细的编写代码,同时应该提供一个机制让用户知道会话已过期的状态。
为此Eric编写了一段程序 Ajax Session Management Timer 帮助解决以上的两个问题,设计思路就是用一个JS的计时器监视距Session过期剩余的时间,并提前用友好的方式提醒用户保存数据或者激发一个延续Session的操作
coreblood 2009-05-13
  • 打赏
  • 举报
回复
经测试发现,访问一般的处理程序(.ashx)不会发生上面所说的问题,
该问题只会在访问异步处理过程中出现.
public class AsynHandle : IHttpAsyncHandler
LutzMark 2009-05-12
  • 打赏
  • 举报
回复
IE这样?
别的浏览器呢?
coreblood 2009-05-11
  • 打赏
  • 举报
回复
~~~ 给点提示行不~~~ 困扰我好久了啊~~~
ximi82878 2009-05-11
  • 打赏
  • 举报
回复
这个跟模板运行机制有关,具体差异,请查阅相关资料~~~^_^
coreblood 2009-05-11
  • 打赏
  • 举报
回复
有兴趣的朋友可以到这连接下载测试程序 http://download.csdn.net/source/1295331

coreblood 2009-05-09
  • 打赏
  • 举报
回复
我先去看看
nosaxw 2009-05-09
  • 打赏
  • 举报
回复
不知道下面的文章是否对你有用。
http://blog.csdn.net/Blade7/archive/2005/05/29/383393.aspx
coreblood 2009-05-09
  • 打赏
  • 举报
回复
Global.asax 内容为空,只有几个系统生产的框架函数... ...
coreblood 2009-05-08
  • 打赏
  • 举报
回复
顶起也好啊,最好给点建议... ....
tubote 2009-05-08
  • 打赏
  • 举报
回复
帮你顶
coreblood 2009-05-08
  • 打赏
  • 举报
回复
自己也顶~~~
diffmaker 2009-05-08
  • 打赏
  • 举报
回复
关注,顶起
tengjian1981 2009-05-08
  • 打赏
  • 举报
回复
Global.asax 内容是什么?会不会有什么影响
加载更多回复(9)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧