当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 用.net 处理xmlHttp发送异步请求

ASP.NET
用 Asp.Net 建立一个在线 RSS 新闻聚合器的方法
关于前台调用后台事件__doPostBack函数
Bin 和 App_Code 文件夹介绍
.NET 2.0 的压缩功能代码
解决Visual Studio 2005 无法显示设计视图的方法
asp.net(c#)两种随机数的算法,可用抽考题
asp.net下url传递中文的解决方案
XmlReader 读取器读取内存流 MemoryStream 的注意事项
asp.net下创建、查询、修改带名称空间的 XML 文件的例子
使用.NET存储XML数据的方法
XslTransform.Transform将结果输出到字符串里的方法
安装 VS2005 SP1 有关问题的解决办法
asp.net下中文验证码,免费开源代码
自定义应用程序配置文件(app.config)
asp.net下使用DIME协议上传文件
动态改变ASP.net页面标题和动态指定页面样式表的方法
WEB上调用HttpWebRequest奇怪问题的解决方法
HTTP协议下用Web Service上传大文件的解决方案
asp.net下Response.ContentType类型汇总
ASP.NET User Control使用技巧一则

ASP.NET 中的 用.net 处理xmlHttp发送异步请求


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 145 ::
收藏到网摘: n/a

最近正在拜读<<Ajax in Action>>这本书,运用书中知识,结合.net,写了这篇用.net 处理xmlHttp发送异步请求的文章。
  
我们要达到的目的是点击按钮,获得服务器的当前时间,aspx的html如下: 
  
以下为引用的内容:

Html
  <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Linkedu.Web.WebWWW.Default" %>
  
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  
  <html xmlns="http://www.w3.org/1999/xhtml" >
  <head runat="server">
   <title>测试</title>
   <script language="javascript" src="javascript/prototype/extras-array.js"></script>
   <script language="javascript" src="javascript/xmlHttp.js"></script>
   <script language="javascript" src="javascript/eventRouter.js"></script>
   <script language="javascript" src="Default.js"></script>
   <script language="javascript">
  
   </script>
  </head>
  <body>
   <form id="form1" runat="server">
   用Post方式获得服务器的当前时间
   <input id="btnTestPost" type="button" value="Post" />
   用Get方式获得服务器的当前时间
   <input id="btnTestGet" type="button" value="Get" />
   <div id="divResult"></div>
  </form>
  </body>
  </html>

  
要用javascript 发送xmlHttp 请求必须解决的问题是跨浏览器的支持。我们把xmlHttp的发送封装在一个javascript对象中,同时在这个对象中解决了跨浏览器支持的问题。代码如下:
  
  xmlHttp对象 
 
以下为引用的内容:
/**//*
  url-loading object and a request queue built on top of it
  */
  
  /**//* namespacing object */
  var net=new Object();
  
  net.READY_STATE_UNINITIALIZED=0;
  net.READY_STATE_LOADING=1;
  net.READY_STATE_LOADED=2;
  net.READY_STATE_INTERACTIVE=3;
  net.READY_STATE_COMPLETE=4;   
   
  /**//*--- content loader object for cross-browser requests ---*/
  net.xmlHttp=function(url, onload, params, method, contentType, onerror){
   this.req=null;
   this.onload=onload;
   this.onerror=(onerror) ? onerror : this.defaultError;
   if(typeof(method) == "undefined" || method == null)
   {
   method = "POST";
   }
   this.loadXMLDoc(url, params, method, contentType);
  }
  
  net.xmlHttp.prototype.loadXMLDoc=function(url, params, method, contentType){
   if (!method){
   method="GET";
   }
   if (!contentType && method=="POST"){
   contentType='application/x-www-form-urlencoded';
   }
   if (window.XmlHttpRequest){
   this.req=new XmlHttpRequest();
   } else if (window.ActiveXObject){
   this.req=new ActiveXObject("Microsoft.xmlHttp");
   }
   if (this.req){
   try{
   var loader=this;
   this.req.onreadystatechange=function(){
   net.xmlHttp.onReadyState.call(loader);
   }
   this.req.open(method,url,true);
   if (contentType){
   this.req.setRequestHeader('Content-Type', contentType);
   }
   this.req.send(params);
   }catch (err){
   this.onerror.call(this);
   }
   }
  }  
   
  net.xmlHttp.onReadyState=function(){
   var req=this.req;
   var ready=req.readyState;
   if (ready==net.READY_STATE_COMPLETE){
   var httpStatus=req.status;
   if (httpStatus==200 || httpStatus==0){
   this.onload.call(this);
   }else{
   this.onerror.call(this);
   }
   }
  }
  
  net.xmlHttp.prototype.defaultError=function(){
   alert("error fetching data!"
   +"\n\nreadyState:"+this.req.readyState
   +"\nstatus: "+this.req.status
   +"\nheaders: "+this.req.getAllResponseHeaders());
  }

下面开始写发送xmlHttp请求的代码:

以下为引用的内容: 
  default.js
  //全局xmlHttp对象
  var cobj;
  
  /**//* Post begin*/
  //绑定Post发送xmlHttp事件到btnTestPost
  function loadTestPost()
  {
   var iobj = document.getElementById("btnTestPost");
   //btnTestPost按钮监听的绑定
   var clickRouter=new jsEvent.EventRouter(iobj,"onclick");
   clickRouter.addListener(btnTestPostClick);
  }
  function btnTestPostClick()
  { // open参数 url, onload, params, method, contentType, onerror
   cobj = new net.xmlHttp("DefaultHandler.ashx",dealResult, "<T/>", "POST");
  }
  /**//* Post end*/
  
  
  /**//* Get begin*/
  //绑定Get发送xmlHttp事件到btnTestGet
  function loadTestGet()
  {
   var iobj = document.getElementById("btnTestGet");
   //btnTestGet按钮监听的绑定
   var clickRouter=new jsEvent.EventRouter(iobj,"onclick");
   clickRouter.addListener(btnTestGetClick);
  }
  function btnTestGetClick()
  { // open参数 url, onload, params, method, contentType, onerror
   cobj = new net.xmlHttp("DefaultHandler.ashx?T=1",dealResult, null, "GET");
  }
  /**//* Get end*/
  
  
  
  function dealResult()
  {
   var dobj = document.getElementById("divResult");
   dobj.innerHTML = cobj.req.responseXML.text;
  }
  
  
  window.onload = function()
  {
   //绑定Post发送xmlHttp事件到btnTestPost
   loadTestPost();
   //绑定Get发送xmlHttp事件到btnTestGet
   loadTestGet();
  };
  
  最后是.net处理xmlHttp的代码
  .net 处理xmlHttp请求
  public class DefaultHandler : IHttpHandler
   {
   protected XmlDocument _xmlResult;
  
   public void ProcessRequest(HttpContext context)
   {
   if (context.Request["T"] != null)
   {//GET xmlhttp测试
   context.Response.ContentType = "text/xml";
   XmlDocument xmlDoc = new XmlDocument();
   xmlDoc.LoadXml(string.Format(@"<time>GET:{0}</time>", System.DateTime.Now));
   xmlDoc.Save(context.Response.OutputStream);
   context.Response.End();
   }
   else
   {//POST xmlhttp测试
   context.Response.ContentType = "text/xml";
   XmlDocument xmlDoc = new XmlDocument();
   xmlDoc.Load(context.Request.InputStream);
   if (xmlDoc.DocumentElement.Name == "T")
   {
   xmlDoc.LoadXml(string.Format(@"<time>POST:{0}</time>", System.DateTime.Now));
   xmlDoc.Save(context.Response.OutputStream);
   context.Response.End();
   }
   }
   }
  
   public bool IsReusable
   {
   get
   {
   return false;
   }
   }
   }