MSXML:从 url 非异步加载 xml 会导致 E_ACCESSDENIED

问题描述 投票:0回答:1

尝试使用 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

奇怪的是:

  • 使用 ServerHTTPRequest 有效
  • 但是使用 DOMDocument 使用 ServerHTTPRequest 失败

我的问题是:为什么会失败?

不是使用Wininet:

即使使用 WinInet,Internet Explorer 选项:

  • Internet 选项高级安全
  • ☐ 不要将加密的页面保存到磁盘

未选中。

那么问题出在哪里?

delphi winapi msxml
1个回答
0
投票

这是

XMLHTTPRequest
中已知的 Won't Fix 错误;它基于 WinINET

解决方案是使用ServerXMLHttpRequest;它基于 WinHTTP

这就是 WinHTTP 最初创建的原因,以修复 WinInet 中的错误。

© www.soinside.com 2019 - 2024. All rights reserved.