asp utf-8 gbk

怪事,ServerXMLHTTP乱码,XMLHTTP却正常?

写道
2009-04-29 00:55:34 来自:帅の玹栤 浏览数:92次
VB code 'Set objXmlHttp=server.createobject("Microsoft.XMLHTTP") '用这句正常 'Set objXmlHttp=server.createobject("Msxml2.XMLHTTP.4.0") '用这句也正常 Set objXmlHttp=server.createobject("MSXML2.ServerXMLHTTP") '用这句则中文显示为乱码 objXmlHttp.open "GET","http://www.a-utf-8-page.com",false '访问页面为utf-8;gbk页面没问题 objXmlHttp.send() Response.BinaryWrite objXmlHttp.responseBody 'Response.Write BytesToBstr(objXmlHttp.responseBody,"GB2312")'用这句进行转换,依然输出乱码 Function BytesToBstr(body,CSet) '将2进制转换为文本字符 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

怪事了,其他两个都没问题的,MSXML2.ServerXMLHTTP这个东西看来有些另类啊。无论我怎么转换编码,就是不显示中文。客户端页面已设置为GB2312编码了。

 

写道
解决了,原来是URL传递的参数中有中文,用Microsoft.XMLHTTP和Msxml2.XMLHTTP.4.0这2个客户端的组件,他们能自动将URL中的中文进行编码,而用MSXML2.ServerXMLHTTP这个服务端的组件,它不会自动进行编码,于是报错.
 
写道
Set objXmlHttp=server.createobject("MSXML2.ServerXMLHTTP") '用这句则中文显示为乱码
objXmlHttp.open "GET","http://www.a-utf-8-page.com",false '访问页面为utf-8;gbk页面没问题
objXmlHttp.send()
Response.BinaryWrite objXmlHttp.responseBody

这4行代码关键问题就在第一行上,换成其他2个组件都没问题,不会有乱码.但ServerXMLHTTP却出现乱码.
 
写道
<script>
var oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
oXmlHttp.open("GET","http://dotnet.aspx.cc/content.aspx", false);
oXmlHttp.send()
var oStream = new ActiveXObject("ADODB.Stream");
if(oStream == null)
alert("您的机器不支持ADODB.Stream.")
else
{
oStream.Type=1;
oStream.Mode=3;
oStream.Open() ;
oStream.Write(oXmlHttp.responseBody);
oStream.Position= 0;
oStream.Type= 2;
oStream.Charset="gb2312";
var result= oStream.ReadText();
oStream.Close();
oStream = null;
alert( result);
}
</script>
 
写道
responseText
将响应信息作为字符串返回
XMLHTTP尝试将响应信息解码为Unicode字符串,XMLHTTP默认将响应数据的编码定为UTF-8,如果服务器返回的数据带 BOM(byte-order mark),XMLHTTP可以解码任何UCS-2 (big or little endian)或者UCS-4 数据。注意,如果服务器返回的是xml文档,此属性并不处理xml文档中的编码声明。你需要使用responseXML来处理。

__________

这个意思是说,如果相关页面是utf-8,则直接用responseText);返回的是unicode(win系统默认编码)

远程获取MSXML2.serverXMLHTTP 和 MSXML2.XMLHTTP

MSXML2.serverXMLHTTP 和 MSXML2.XMLHTTP在做一个垃圾站采集的时候遇到问题,用风讯 4.0采集到一定数目的时候总是提示 “出现一个意外错误: ”Send” ”,查看function.asp代码,发现问题应该是出在 MSXML2.XMLHTTP上,而且应该是win2003下容易出现。这种情况一般重启IIS,或者站点文件重置一下权限就可以解决。毫无疑问这种解决办法对大多数站长不适应,也不是我们的态度。
在网上查了查资料,发现出现这种问题的很多,不过都没有解决。风讯论坛上有一个提问的,没有答案。后来我试着将 MSXML2.XMLHTTP 在config2.asp 中修改为 MSXML2.serverXMLHTTP,BINGO!而且微软的文档也显示,不建议在服务器上使用 MSXML2.XMLHTTP,好像是因为会出现占用资源过高的情况吧。

 

 


XMLHTTP 为客户端应用程序而设计,并依赖于基于 Microsoft Win32 Internet (WinInet) 而构建的 URLMon。ServerXMLHTTP 为服务器应用程序而设计,并依赖于新的 HTTP 客户端堆栈 WinHTTP。ServerXMLHTTP 提供了可靠性和安全性,并且是服务器安全的。有关更多信息,请参见 MSXML 软件开发工具包 (SDK) 文档。

本文回答有关 ServerXMLHTTP 对象的一些常见问题。
更多信息
1. 什么是 ServerXMLHTTP?

ServerXMLHTTP 为不同 Web 服务器之间的服务器安全 HTTP 访问提供方法和属性。您可以使用此对象在不同的 Web 服务器之间交换 XML 数据。


2. 如何安装 ServerXMLHTTP?

ServerXMLHTTP 随 Microsoft XML Parser (MSXML) 版本 3.0 或更高版本提供。您可以从以下 Microsoft Developer Network (MSDN) 网站下载并安装 MSXML 3.0:
http://www.microsoft.com/downloads/details.aspx?amp;displaylang=en&familyid=8167837e-0983-4988-99a4-377ef5c0da2e&displaylang=en (http://www.microsoft.com/downloads/details.aspx?amp;displaylang=en&familyid=8167837e-0983-4988-99a4-377ef5c0da2e&displaylang=en )
3. ServerXMLHTTP 具有什么平台要求?

ServerXMLHTTP 支持仅在安装 Microsoft Windows 2000 的计算机上或者在安装带 Microsoft Internet Explorer 5.01(或更高版本)的 Microsoft Windows NT 4.0 的计算机上提供。它在其他平台(如 Microsoft Windows 95 和 Microsoft Windows 98)上将失败。

由于 XMLHTTP 内部使用 WinInet,所以不支持在服务器端应用程序(例如 Active Server Pages (ASP))、宿主在 COM+ 中的组件,或 Windows 服务中使用 XMLHTTP。 有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
238425 (http://support.microsoft.com/kb/238425/ ) 不支持在服务中使用 WinInet

4. XMLHTTP 和 ServerXMLHTTP 之间的区别是什么?

XMLHTTP 为客户端应用程序而设计,并依赖于基于 Microsoft Win32 Internet (WinInet) 而构建的 URLMon。ServerXMLHTTP 为服务器应用程序而设计,并依赖于新的 HTTP 客户端堆栈 WinHTTP。ServerXMLHTTP 提供了可靠性和安全性,并且是服务器安全的。有关更多信息,请参见 MSXML 软件开发工具包 (SDK) 文档。

5. 如何在 XMLHTTP 和 ServerXMLHTTP 之间做出选择?

正如其名称所示,ServerXMLHTTP 推荐用于服务器应用程序,而 XMLHTTP 推荐用于客户端应用程序。XMLHTTP 具有一些优点,如支持缓存和自动发现代理。它可以在 Windows 95 和 Windows 98 平台上使用,并且非常适合单用户桌面应用程序。


6. 什么是代理配置实用工具?

WinHTTP 代理配置实用工具 Proxycfg.exe 允许将 WinHTTP 配置为通过代理服务器访问 HTTP 和 HTTPS 服务器。由于 ServerXMLHTTP 组件依赖于 WinHTTP 代理设置,因此在部署和安装使用 WinHTTP 的应用程序的过程中,管理员可以使用 Proxycfg.exe 实用工具。有关更多信息,请参见下面的 Microsoft 知识库文章:
289481 (http://support.microsoft.com/kb/289481/ ) 可能需要运行 Proxycfg 工具以使 ServerXMLHTTP 正常工作
7. ServerXMLHTTP 是否支持 SSL 和数字证书?

ServerXMLHTTP 和 XMLHTTP 组件在 MSXML3 中对 HTTPS 的支持比较有限。具体说就是,它们不完全支持用于身份验证的安全套接字层 (SSL) 证书。这些组件虽然支持 HTTPS 协议,但如果服务器要求客户端证书,请求将会失败。

ServerXMLHTTP 在 MSXML 3.0 Service Pack 1 中包括了 SSL 证书支持。


8. ServerXMLHTTP 有什么优点?• 通过使用 ServerXMLHTTP,可以在本地和远程系统之间以流或 XML 文档的形式交换 XML 数据。
• 由于基础协议为 HTTP 或 HTTPS,因此可以在防火墙后的系统之间交换数据。
• ServerXMLHTTP 可用于从不同的环境(如 Active Server Pages (ASP)、Microsoft Visual Basic 和 Microsoft Visual C++)发送 HTTP 请求。

9. ServerXMLHTTP 存在什么限制?

可同时存在于单一进程中的 ServerXMLHTTP 实例数主要取决于可用于系统上应用程序的内存大小。但是,其他因素(如 CPU 处理能力或者可用的套接字连接)会进一步限制可以同时处于活动状态的实例数。

就 MSXML 3.0 而言,可同时存在于单一进程中的最大实例数为 5,460。


10. 在哪里可以找到有关 ServerXMLHTTP 的更多信息?

本文的大部分信息都取自 MSXML SDK,它可以从以下 MSDN 网站的 XML 部分下载:
http://msdn.microsoft.com/xml/default.aspx (http://msdn.microsoft.com/xml/default.aspx )

XMLHTTP传值如何在固定时间内没有取到返回值后自己中断

function send(url)
Dim xml
Set xml = Server.CreateObject("Microsoft.XMLHTTP")     
xml.Open "GET", url, False
xml.Send
if xml.responseText<>"" then
send=xml.responseText'获得返回值
else
send="NO"'无法获得返回值
end if
Set xml = Nothing
end function
   
   
上面是同步方式发送数据,但是当无法得到返回值的时候就一直等待服务器的响应,这样很容易把服务器拖垮,我想设置在固定时间内(如30s)如果没有得到返回值就中断操作。
   
听说这要在异步方式下才能做到,但除了改这个参数,如何进行其它的步骤?
________________________________________________
可以试试ServerXMLHTTP
   
Dim xmlServerHttp
Set xmlServerHttp = Server.CreateObject("Msxml2.ServerXMLHTTP")   
Dim lResolve, lConnect, lSend, lReceive
lResolve = 5 * 1000
lConnect = 5 * 1000
lSend = 15 * 1000
lReceive = 15 * 1000
xmlServerHttp.setTimeouts lResolve, lConnect, lSend, lReceive
xmlServerHttp.open "GET", "http://localhost/sample.xml ", False
xmlServerHttp.send

MSXML2.ServerXMLHTTP使用实例
<%
'使用范例
'读取URL 的HTML
dim myHttp
set myHttp=new xhttp
myHttp.URL="http://www.baidu.com "
Response.Write(myHttp.html)
'保存远程图片到本地
myHttp.URL="http://www.baidu.com/img/logo.gif "
myHttp.saveimage "myfile.gif"
'为防止xhttp卡死的情况,使用超时,错误处理
dim sHtmlcode,iStep
myHttp.URL="http://www.hrbshopping.com "
sHtmlcode=myHttp.html
iStep=0
do while myHttp.xhttpError=""
Response.Write("ERROR: AGAIN!<br />")
sHtmlcode=myHttp.html
iStep=iStep+1
if iStep=1 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
%>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值