用MSXML2.ServerXMLHTTP的setTimeouts属性解决并死问题

时间:2010-03-02 20:21:00 

照例使用XMLhttp同步方式获取数据,可是由于网络不稳定,经常造成'死锁'状况,既send之后一直不返回服务器结果,也不出错.

被这个问题折磨了好久,最后才查到还有ServerXMLHTTP这个对象,看了介绍才知道它才是天生为了服务器端获取其他网站信息设计的.利用他的超时机制setTimeouts,问题轻松解决:D

参考:

http://support.microsoft.com/kb/290761/zh-cn

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/97884cf6-5fdf-4b1f-8273-73c0e098b8f3.asp

下面付简单封装了ServerXMLHTTP的简单类,共参考:

<% 
'使用范例
'读取URL 的HTML
dim myHttp
set myHttp=new xhttp
myHttp.URL="http://www.aspxhome.com"
Response.Write(myHttp.html)
'保存远程图片到本地
myHttp.URL="https://www.aspxhome.com/images/logo.gif"
myHttp.saveimage="myfile.gif"
'为防止xhttp卡死的情况,使用超时,错误处理
dim sHtmlcode,iStep
myHttp.URL="http://www.acnow.net"
sHtmlcode=myHttp.html
do while myHttp.xhttpError=""
    Response.Error("ERROR: AGAIN!<br />")
    sHtmlcode=myHttp.html
    iStep=iStep+1
    if iStep>100 then
        Response.Write("ERROR:OVER!<hr />")
        exit do
    end if
loop
Response.Write(sHtmlcode)
set myHttp=nothing
'--------------------------------------------------------------------
Class xhttp
    private cset,sUrl,sError
    Private Sub Class_Initialize()
        'cset="UTF-8"
        cset="GB2312"
        sError=""
    end sub
    Private Sub Class_Terminate()
    End Sub
        Public Property LET URL(theurl)
                sUrl=theurl
        end property
        public property GET BasePath()
                BasePath=mid(sUrl,1,InStrRev(sUrl,"/")-1)
        end property
        public property GET FileName()
                FileName=mid(sUrl,InStrRev(sUrl,"/")+1)
        end property
        public property GET Html()
                Html=BytesToBstr(getBody(sUrl))
        end property
        
        public property GET xhttpError()
                xhttpError=sError
        end property
        
        private Function BytesToBstr(body)
                on error resume next
                'Cset:GB2312 UTF-8
                dim objstream 
                set objstream = Server.CreateObject("adodb.stream") 
                with objstream
                        .Type = 1 '
                        .Mode = 3 '
                        .Open     
                        .Write body  '
                        .Position = 0 '
                        .Type = 2  '
                        .Charset = Cset  '
                        BytesToBstr = .ReadText '
                        .Close 
                end with
                set objstream = nothing 
        End Function 
        
        private function getBody(surl)
                on error resume next
                dim xmlHttp
                'Set xmlHttp=server.createobject("Msxml2.XMLHTTP.4.0")
                'set xmlHttp=server.createobject("Microsoft.XMLHTTP")
                set xmlHttp=server.createobject("MSXML2.ServerXMLHTTP")
                xmlHttp.setTimeouts 10000,10000,10000,30000
                xmlHttp.open "GET",surl,false
                xmlHttp.send
                if xmlHttp.readystate=4 then 
                'if xmlHttp.status=200 then
                         getBody=xmlhttp.responsebody
                'end if
                         else
                getBody=""
                end if
        
                if Err.Number<>0 then 
                        sError=Err.Number
                        Err.clear
                else
                        sError=""
                end if
                set xmlHttp=nothing
        end function
        
        Public function saveimage(tofile)
                on error resume next
                dim objStream,imgs
                imgs=getBody(sUrl)
                Set objStream = Server.CreateObject("ADODB.Stream")
                with objStream
                        .Type =1
                        .Open
                        .write imgs
                        .SaveToFile server.mappath(tofile),2
                        .Close()
                end with
                set objstream=nothing
        end function
end class
 
%> 

标签:XMLHTTP,ServerXMLHTTP,
0
投稿

猜你喜欢

  • tensorflow实现将ckpt转pb文件的方法

    2023-03-24 19:05:05
  • TensorFlow tf.nn.max_pool实现池化操作方式

    2021-08-20 20:36:45
  • 利用scrapy将爬到的数据保存到mysql(防止重复)

    2024-01-23 15:35:28
  • Vue开发环境跨域访问问题

    2023-07-02 17:07:34
  • 如何在Python中创建二叉树

    2022-07-30 06:27:35
  • Python向Excel中插入图片的简单实现方法

    2022-09-27 21:41:59
  • 解决Python运算符重载的问题

    2022-07-04 23:09:33
  • 《JavaScript语言精粹》

    2009-04-03 11:27:00
  • phpMyAdmin安装配置方法

    2009-09-09 20:15:00
  • Asp包含文件include动态包含方法(含变量)

    2010-01-14 20:12:00
  • Web标准的web UI

    2008-01-02 12:34:00
  • Django与JS交互的示例代码

    2023-05-03 13:38:58
  • 使用python将excel数据导入数据库过程详解

    2024-01-22 11:28:31
  • 2008农历新年各大网站Logo秀

    2008-02-11 16:33:00
  • Golang json 库中的RawMessage功能原理

    2024-04-30 10:07:27
  • VScode中集成Git命令详解

    2022-09-21 00:57:55
  • VuePress使用Algolia实现全文搜索

    2024-04-28 09:29:56
  • 基于JS实现经典的井字棋游戏

    2024-04-28 09:51:10
  • Vuex中actions的使用教程详解

    2024-04-30 08:45:29
  • 关于numpy和torch.tensor的张量的操作

    2023-12-30 23:35:25
  • asp之家 网络编程 m.aspxhome.com