尝试使用 msxml 从 url 加载 xml:
.async
设置为 false(默认为 true)会导致 E_ACCESSDENIED
尝试从 url 加载时出错
var
doc: DOMDocument60;
begin
doc := CoDOMDocument60.Create;
doc.async := False; // Default is True
doc.load('https://www.treasury.gov/ofac/downloads/sdn.xml');
为什么会导致
E_ACCESSDENIED
异常?
解决方法很简单:
var
http: IServerXMLHTTPRequest;
doc: DOMDocument60;
begin
http := CoServerXMLHTTP60.Create;
http.open('GET', 'https://www.treasury.gov/ofac/downloads/sdn.xml',
False, EmptyParam, EmptyParam);
http.send(EmptyParam);
doc := http.ResponseXML as DOMDocument60;
当然我不是在问解决方法。我问为什么首先需要解决方法。
有趣的是,虽然
IServerXMLHTTPRequest
可以工作,并且只支持同步加载,但要求 DOMDocument60
同步使用 ServerHTTPRequest
却不工作:
var
doc: DOMDocument60;
begin
doc := CoDOMDocument60.Create;
doc.async := False; // Default is True. Must be false if we use ServerHTTPRequest
doc.setProperty('ServerHTTPRequest', True);
doc.load('https://www.treasury.gov/ofac/downloads/sdn.xml'); E_ACCESSDENIED
奇怪的是:
我的问题是:为什么会失败?
它不是使用Wininet:
即使使用 WinInet,Internet Explorer 选项:
未选中。
那么问题出在哪里?
这是
XMLHTTPRequest中已知的
Won't Fix
错误;它基于 WinINET。
解决方案是使用ServerXMLHttpRequest;它基于 WinHTTP。
这就是 WinHTTP 最初创建的原因,以修复 WinInet 中的错误。