【问题标题】:Exchange Web Services with Delphi使用 Delphi 交换 Web 服务
【发布时间】:2015-02-08 05:30:30
【问题描述】:

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

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

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

清单 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;

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

如何设置用户凭据?

【问题讨论】:

  • 我从来没有让这个在 Delphi 中工作,我最终制作了一个中间 .NET DLL,你可以很容易地使用它。
  • 我强烈建议您使用 Indy 组件来使用 EWS wsdl,而不是使用 HttpRIO。
  • @RBA 你可以添加一些细节(也许作为一个完整的答案)? THttpRIO 没有基于 Indy 的插入式替换组件。 Indy (TIdHTTP) 可用于下载基于 Web 的 WSDL 资源,但这无助于解决实际的互操作问题。
  • 您拥有UserName/PasswordTHTTPRIO.HTTPWebNode (THTTPReqResp) 属性怎么样,还是我错过了什么?
  • 离题,但是您是如何设法导入 WSDL 的?

标签: delphi soap exchangewebservices


【解决方案1】:

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

(1) 认证

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

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

如果使用 TIdHTTP,则需要使用代理相关的属性。

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

(2) EWS Soap 交易使用什么组件?

我无法让标准的肥皂解决方案 THTTPRio 组件工作。问题是 THTTPRio 组件没有生成正确形状的请求信封。没有详细说明,存在许多问题,例如应该放置在正文中的元素会出现在标题中,以及架构违规。如果你能让这个(基于已发布 wsdl 的 THTTPRio)工作,(但我对此表示怀疑),值得注意的是 wsdl 需要调整以包含服务节点。微软出于安全原因故意排除了服务节点,但它是 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 文档。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多