在把大量的XML作为POST数据的一部分发送给你的IIS服务器的时候——诸如在ASP表单的TEXTAREA里——你可能会得到一些没有预料到的结果。当数据在服务器上被处理的时候,由于你处理数据方式的不同,你最终可能会碰到错误。其原因是,当你把数据提交回服务器的时候,POST字段里有一个(数据)大小的限制。这样做的目的是为了防止可能的入侵者在实施拒绝服务(denial of service,DoS)的攻击中向服务器发送超大量的数据。

这一限制也束缚你的能力。但是有办法解决这个问题。如果你没被限制在只能够通过FORM提交来发送数据,那么你就可以使用XMLHTTP对象(微软的XML集里的一个DOM对象)来发送所需要的XML:

var oXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");oXMLHTTP.open("POST", "xml_handler.asp", false);oXMLHTTP.send(xml_to_send);

由于Request对象会实现IStream接口,所以你可以通过使用DOMDocument对象的load()方法来加载所要提交的XML:

Dim oDOMSet oDOM = Server.CreateObject("MSXML2.DOMDocument")oDOM.load Request

如果你被限制在只能够使用FORM提交,那么你可以通过提交多个TEXTAREA或者INPUT来跨越这一限制,前面两者在服务器一接收到这个FORM数据的时候就可以被重新组合在一起:

var MAXLEN = 90000;var oForm = document.createElement("FORM");oFORM.method = "POST";oFORM.action = "xml_handler.asp";oFORM = document.body.appendChild(oFORM);var s = document.someForm.txtXML.value;if (s.length > MAXLEN) {   while (s.length > MAXLEN) {     var o = document.createElement("INPUT");     o.type = "hidden";     o.name = "txtXML";     o.value = s.substr(0, MAXLEN);     oFORM.appendChild(o);     s = s.substr(MAXLEN);   }   var o = document.createElement("INPUT");   o.type = "hidden";   o.name = "txtXML";   o.value = s.substr(0, MAXLEN);   oFORM.appendChild(o);} else {   var o = document.createElement("INPUT");   o.type = "hidden";   o.name = "txtXML";   o.value = s;   oFORM.appendChild(o);}

这一段代码会创建一个新的FORM元素,用来处理数据的提交,并将它放置到BODY元素内。然后,它会检查即将提交给服务器的XML的长度。这个XML驻留在someForm内部一个叫做txtXML的TEXTAREA里。

如果这个XML大于90,000字符的MAXLEN,那么这段代码就会创建多个隐藏的INPUT(输入)元素,并把值的属性设置为90,000个字符的XML数据,或者设置为XML尾部的某个值,从而将这个数据分割成多个部分。如果这个XML的大小小于MAXLEN,那么这段代码就只会创建一个INPUT并相应地设置值。然后这个数据就被提交到服务器供处理。

你可能已经注意到,我把相同的名称——txtXML——指定给新表单的每个字段。这将有助于把XML数据同其他可能会被提交的数据分隔开来,并为重组XML数据提供了一种简单的方式。在重组数据的时候,你需要一个简单的循环来连接字段里的数据:

Dim str, fldFor Each fld In Request.Form("txtXML")   str = str & fldNext

由于已经为每个FORM元素都创建了一个字段集,所以你可以在同一个名称的字段里迭代。只要以适当的顺序在客户端创建FORM元素,你就不需要担心字段被遍历的顺序。通过FORM的appendChild()方法,这能够被轻易地实现。

数据在客户端是按照从左到右、从上到下的顺序被提交的,所以当你把INPUT元素附加到FORM元素尾部的时候,在你服务端也总是按照同样的顺序来接收数据的。

如果你正在寻求实现一个大型的数据解决方案,例如将大量的Excel数据从客户机器传递到服务器上,那么你就应该重新考虑是否要使用FORM提交,或者将数据从逻辑上分成多个小的部分。由于你无法使用文件类型INPUT元素,所以最具有创造力的解决方案是将数据在本地转变成为XML,再将XML数据提交给服务器。反过来,数据会保存在服务器上,直到需要更进一步处理。

当然,处理这个问题可能会有更好的方法。但是当你没有太多时间的时候,你所需要的就是一个快速的、可用的解决方案。

更多相关文章

  1. 如何使用XSL来显示XML数据的详解
  2. XML数据岛之数据绑定实例详解
  3. 详细介绍XML中的DOCTYPE字段
  4. XML数据岛之数据修改与添加
  5. XML数据岛之数据分页显示
  6. 关于读大数据量的XML文件的读取问题
  7. 通过Spry将XML数据显示到HTML页教程
  8. RSS与爬虫,如何搜集数据详解
  9. 把SQL Server中的数据导出为XML和Json的方法解析

随机推荐

  1. 2010.12.19——— android 设置组件的高
  2. 【Android】Android用tabhost实现 界面切
  3. Android Audio 框架简读
  4. 禁止Android的StatusBar下拉
  5. [Android]手动触发OnClick事件
  6. Android 判断是否连接网络
  7. Activity的启动流程
  8. Android 音量增加减少按钮事件
  9. android调用系统的相机服务
  10. AIDL