gpt4 book ai didi

delphi - 与 Delphi 交换 Web 服务

转载 作者:行者123 更新时间:2023-12-03 15:36:21 25 4
gpt4 key购买 nike

我想创建一个Exchange Web Services (EWS)使用Delphi XE6的客户端应用程序。

我正在使用带有 wsdl 的 THttpRio 组件。如何设置用户凭据?在其他语言中,THttpRio 组件的等效项具有 Credentials 属性 ( example )。但 Delphi 组件中缺少此功能。

身份验证机制(除了模拟)不是 ews wsdl 的一部分。它是 SOAP 层 native 的。

list 1:

procedure TForm1.Button1Click( Sender: TObject);
var
lESB : ExchangeServicePortType;
request : GetServiceConfiguration;
Impersonation : ExchangeImpersonation;
RequestVersion: RequestServerVersion;
MailboxCulture1: MailboxCulture;
GetServiceConfigurationResult: GetServiceConfigurationResponse;
ServerVersion : ServerVersionInfo;
begin
lESB := HTTPRIO1 as ExchangeServicePortType;
request := GetServiceConfiguration.Create;
request.RequestedConfiguration := ArrayOfServiceConfigurationType.Create( 'UnifiedMessagingConfiguration');
Impersonation := ExchangeImpersonation.Create;
RequestVersion := RequestServerVersion.Create;
MailboxCulture1 := MailboxCulture.Create;
GetServiceConfigurationResult:= GetServiceConfigurationResponse.Create;
ServerVersion := ServerVersionInfo.Create;
try
lESB.GetServiceConfiguration(
request, Impersonation, RequestVersion, MailboxCulture1,
GetServiceConfigurationResult, ServerVersion)
finally
request.Free;
Impersonation.Free;
RequestVersion.Free;
MailboxCulture1.Free;
GetServiceConfigurationResult.Free;
ServerVersion.Free
end
end;

上面的 list 1 显示了我迄今为止尝试过的一些示例代码。该函数的目的是获取服务器的版本信息。 HTTPRIO1 是一个具有默认属性的 THTTPRIO 组件,并连接到 EWS 的标准 wsdl。这不起作用,因为未设置用户凭据。

如何设置用户凭据?

最佳答案

经过多次尝试和错误,这是我想出的解决方案......

(1) 身份验证

如果使用 THTTPRio 组件,从通过代理服务器建立互联网连接的角度来看,THHPRio 的 HTTPWebNode 属性的用户名/密码属性对可用于识别用户的凭据。

如果使用 THTTPReqResp 组件,则该组件直接拥有相同的 UserName/Password 属性。

如果使用 TIdHTTP,则可以使用与代理相关的属性。

如果您想使用当前登录的凭据,并显式地将密码传递到组件上,则可以通过将 THTTPRio 和 THTTPReqResp 组件的 UserName 和 Password 属性留空来实现此目的。代理信息将自动从系统注册表中获取。然而 TIdHTTP 是不同的。该组件需要显式设置代理配置,包括互联网用户的凭据。

(2) EWS Soap 事务使用什么组件?

我无法使用标准 SOAP 解决方案 THTTPRio 组件来工作。问题在于 THTTPRio 组件未生成正确形状的请求信封。无需详细说明,存在许多问题,例如本应放置在正文中的元素却出现在标题中,以及架构违规。如果您能让这个(基于已发布的 wsdl 的 THTTPRio)工作,(但我对此表示怀疑),那么值得注意的是,需要调整 wsdl 以包含服务节点。出于安全原因,Microsoft 特意排除了该服务节点,但它是正确操作 Delphi Soap 向导所必需的。

如果您的应用程序位于防火墙后面并且必须与代理服务器协商,那么开发基于 TIdHTTP 的解决方案是行不通的。

最简单、最好的解决方案是使用 THTTPReqResp 组件。你甚至不需要 wisdl 来做到这一点。您必须制作自己的 xml 请求信封,但有了 Microsoft 出色的文档(显示了简单的信封),这项任务就轻而易举了。

(3)关于使用THTTPReqResp访问EWS

  1. EWS 使用 UTF-8,因此设置 UseUTF8InHeader := True
  2. 设置 InvokeOptions = [soIgnoreInvalidCerts, soAutoCheckAccessPointViaUDDI]
  3. 根据需要将 URL 设置为服务服务器 URL。
  4. 将 SoapAction 设置为 http://schemas.microsoft.com/exchange/services/2006/messages
  5. 根据需要设置用户名和密码,或留空以使用登录用户的凭据。
  6. EWS 使用 SOAP 1.1,不是 1.2,因此从 WebNodeOptions 中排除 wnoSOAP12。
  7. 在线利用 MSDN。这是一个极好的资源,包含大量示例。

(4) 关于构建 XML 文档。

Soap 信封是遵循特定发布格式的 XML 文档,其中嵌入了您的请求数据。如何构建这些信封?

这里有两种对我来说效果很好的可能方法:

  1. 使用模板软件设计模式。例如,我使用一个与 TPageProducer 非常相似的组件。获取您的基本模板,然后使用标签替换来实现您想要的结果。我的 PageProducer 版本可以定义可选片段,或重复 n 次的片段(每次迭代使用不同的数据),并在一个模板中进行标记。
  2. 使用 XSLT。这是最简单的解决方案。它几乎是免费的。

这里有两种可能的方法,您可以使用,但我建议反对。并不是说它们不起作用,而是这些技术太笨拙并且需要太多编码:

  1. 手动将文档逐个部分构造为字符串(或使用字符串生成器)。
  2. 使用标准 XML 接口(interface)(IXMLNode 等)逐部分构建文档,然后输出结果。

关于delphi - 与 Delphi 交换 Web 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27393926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com