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

ASP.NET
如何在ASP.NET中使用SmtpMail发送邮件
在VB.NET中利用Split和Replace函数计算字数
Attribute应用:简化ANF自定义控件初始化过程
ASP.NET 2.0移动开发入门之使用样式
ASP.NET 2.0中使用OWC生成图表
ASP.NET 2.0中控件的简单异步回调
一个无法捕获ADO.NET Dataset的内存错误
深入解读ADO.NET2.0的十大最新特性
.Net平台下的分布式缓存设计
ASP.NET全局异常处理浅析
ASP.NET 2.0中文验证码的实现
浅析.NET平台编程语言的未来走向
.net 框架程序设计收藏
使用ASP.NET MVC Futures 中的异步Action
详解.NET中的XmlReader与XmlWriter
关于.NET中的Server push技术
asp.net页面执行机制
对比JSP和ASP.NET的存储过程
.NET 4.0不会包含System.Shell.CommandLine
ASP.NET十个有效性能优化的方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 158 ::
收藏到网摘: 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;
   }
   }
   }