XMLHTTP.send请求带回“Nothing”

我有一个电子表格,其中有数百个链接指向可以通过networking访问的服务器(具有身份validation)。 我一直在寻找一个电子表格中的链接检查器的解决scheme,它会告诉我哪些链接是坏的,哪些是好的。 通过破碎我的意思是说,网站不会被调用。

我在网上find了各种各样的解决scheme,但没有一个适合我。 我被这个吓坏了

我尝试使用并找出的一个例子重新张贴在下面。

正如我已经通过代码,我已经认识到, oHTTP.send请求带回“没有”。 对于电子表格中的所有链接,无论链接是否有效,都是如此。

 Public Function CheckHyperlink(ByVal strUrl As String) As Boolean Dim oHttp As New MSXML2.XMLHTTP30 On Error GoTo ErrorHandler oHttp.Open "HEAD", strUrl, False oHttp.send If Not oHttp.Status = 200 Then CheckHyperlink = False Else CheckHyperlink = True Exit Function ErrorHandler: CheckHyperlink = False End Function 

有什么可能是错误的,或正确的build议,高度赞赏!

一些可能的原因..

  1. 你的意思是oHttp.Open "GET", strUrl, False而不是oHttp.Open "HEAD", strUrl, False
  2. 也许MSXML2.XMLHTTP30不可用? 你可以声明一个MSXML2.XMLHTTPX的实例作为早期绑定或者后期绑定,这可能会影响你想要使用的版本与可用的版本(例如http://word.mvps.org/FAQs/InterDev/EarlyvsLateBinding.htm

例如

 Option Explicit 'Dim oHTTPEB As New XMLHTTP30 'For early binding enable reference Microsoft XML, v3.0 Dim oHTTPEB As New XMLHTTP60 'For early binding enable reference Microsoft XML, v6.0 Sub Test() Dim chk1 As Boolean Dim chk2 As Boolean chk1 = CheckHyperlinkLB("http://stackoverflow.com/questions/11647297/xmlhttp-send-request-brings-back-nothing") chk2 = CheckHyperlinkEB("http://stackoverflow.com/questions/11647297/xmlhttp-send-request-brings-back-nothing") End Sub Public Function CheckHyperlinkLB(ByVal strUrl As String) As Boolean Dim oHTTPLB As Object 'late bound declaration of MSXML2.XMLHTTP30 Set oHTTPLB = CreateObject("Msxml2.XMLHTTP.3.0") On Error GoTo ErrorHandler oHTTPLB.Open "GET", strUrl, False oHTTPLB.send If Not oHTTPLB.Status = 200 Then CheckHyperlinkLB = False Else CheckHyperlinkLB = True Set oHTTPLB = Nothing Exit Function ErrorHandler: Set oHTTPLB = Nothing CheckHyperlinkLB = False End Function Public Function CheckHyperlinkEB(ByVal strUrl As String) As Boolean 'early bound declaration of MSXML2.XMLHTTP60 On Error GoTo ErrorHandler oHTTPEB.Open "GET", strUrl, False oHTTPEB.send If Not oHTTPEB.Status = 200 Then CheckHyperlinkEB = False Else CheckHyperlinkEB = True Set oHTTPEB = Nothing Exit Function ErrorHandler: Set oHTTPEB = Nothing CheckHyperlinkEB = False End Function 

编辑:

我testing了OP的链接,在浏览器中打开,现在我发现redirect到login页面,所以它是我testing的另一个链接。 这可能是失败的,因为oHttp对象没有被设置为允许redirect。 我知道可以使用下面的代码为WinHttp.WinHttpRequest.5.1设置redirect。 我需要调查,如果这也适用于MSXML2.XMLHTTP30虽然。

 Option Explicit Sub Test() Dim chk1 As Boolean chk1 = CheckHyperlink("http://portal.emilfrey.ch/portal/page/portal/toyota/30_after_sales/20_ersatzteile%20und%20zubeh%C3%B6r/10_zubeh%C3%B6r/10_produktbezogene%20informationen/10_aussen/10_felgen/10_asa-pr%C3%BCfberichte/iq/tab1357333/iq%20016660.pdf") End Sub Public Function CheckHyperlink(ByVal strUrl As String) As Boolean Dim GetHeader As String Const WinHttpRequestOption_EnableRedirects = 6 Dim oHttp As Object Set oHttp = CreateObject("WinHttp.WinHttpRequest.5.1") On Error GoTo ErrorHandler oHttp.Option(WinHttpRequestOption_EnableRedirects) = True oHttp.Open "HEAD", strUrl, False oHttp.send If Not oHttp.Status = 200 Then CheckHyperlink = False Else GetHeader = oHttp.getAllResponseHeaders() CheckHyperlink = True End If Exit Function ErrorHandler: CheckHyperlink = False End Function 

EDIT2:

MSXML2.XMLHTTP确实允许redirect(虽然我相信MSXML2.ServerXMLHTTP不)。 redirect是允许/不允许的,这取决于redirect是跨域,跨端口等(详见http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx )

由于redirect到login页面是跨域的,所以IE区域策略被实现。 打开IE /工具/ Internet选项/安全性/自定义级别并将“跨数据源访问数据源”更改为ENABLED

原来的OP代码现在会正确redirect。