VBA调用带Basic认证Webservice时认证信息缓存问题咨询
解决VBA调用Basic认证Webservice的凭据缓存问题
我来帮你搞定这个头疼的缓存问题——你遇到的其实是MSXML2.XMLHTTP依赖的WinINet库默认缓存Basic认证凭据的行为,导致后续哪怕传错误密码也能蒙混过关。下面针对你的两个问题逐一解答:
1. 缓存数据的存储位置与删除方法
存储位置
MSXML2.XMLHTTP用的是Windows WinINet缓存,和IE的浏览缓存是共享的,具体路径根据Windows版本略有不同:
- Win10/11:
C:\Users\<你的用户名>\AppData\Local\Microsoft\Windows\INetCache - 旧版Windows:
C:\Users\<你的用户名>\AppData\Local\Microsoft\Windows\Temporary Internet Files
这里面不仅存网页缓存,还藏着Basic认证的凭据信息。
删除方式
手动清除
- 打开IE(或者Edge的IE模式),依次点设置→互联网选项→常规→删除,勾选「密码」和「临时Internet文件」,确认后就能清掉缓存的凭据。
- 也可以直接导航到上面的缓存目录,删掉里面的所有文件(注意有些文件可能被占用,得先关掉相关进程)。
VBA代码自动清除
你可以调用Windows API来精准清除指定URL的缓存凭据,示例代码如下:
' 声明WinINet API函数(64位Office用PtrSafe,32位去掉) Private Declare PtrSafe Function DeleteUrlCacheEntry Lib "wininet.dll" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long Sub ClearWebserviceAuthCache(strTargetUrl As String) Dim lngResult As Long lngResult = DeleteUrlCacheEntry(strTargetUrl) If lngResult = 0 Then Debug.Print "缓存清除失败,错误代码:" & Err.LastDllError Else Debug.Print "指定URL的认证缓存已清除" End If End Sub
调用时直接传你的Webservice URL就行:ClearWebserviceAuthCache(strUrl)
2. 阻止VBA保存认证数据的根本解决办法
要从根源上避免这个问题,直接禁用MSXML2.XMLHTTP的凭据缓存功能就行——通过SetOption方法设置SXH_OPTION_DISABLE_USERNAME_PASSWORD_CACHING选项(对应值为4)。修改你的代码如下:
Set objRequest = CreateObject("MSXML2.XMLHTTP") blnAsync = True With objRequest ' 关键:禁用凭据缓存,避免后续请求自动复用旧凭据 .SetOption 4, True ' SXH_OPTION_DISABLE_USERNAME_PASSWORD_CACHING = 4 .Open "GET", strUrl, blnAsync .setRequestHeader "Authorization", "Basic " + EncodeBase64(user + ":" + passw) .Send ' 等待响应返回 While objRequest.readyState <> 4 DoEvents Wend strResponse = .responseText End With
额外小技巧
如果上面的方法没生效,你可以试试改用MSXML2.ServerXMLHTTP对象,它的默认缓存策略更严格,不过同样可以加上上面的SetOption设置来确保万无一失。另外,临时绕开的方法是给URL加个随机参数(比如?t= & Timer),让每次请求的URL都是唯一的,不过这只是治标不治本,还是禁用缓存更靠谱。
内容的提问来源于stack exchange,提问作者Poppypraun
相关产品推荐
相关产品推荐

