使用Delphi交换Web服务

时间:2014-12-10 05:32:18

标签: delphi soap exchangewebservices

我想使用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。这不起作用,因为未设置用户凭据。

如何设置用户凭据?

1 个答案:

答案 0 :(得分:0)

经过大量的反复试验,这就是我提出的解决方案......

(1)认证

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

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

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

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

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

我无法使用标准肥皂溶液THTTPRio组件。问题是THTTPRio组件没有产生正确的请求信封形状。没有详细说明,存在许多问题,例如应该放在正文中的元素,将出现在标题中,以及模式违规。如果你可以得到这个(基于已发布的wsdl的THTTPRio),(但我怀疑它),值得注意的是wsdl需要被调整以包含服务节点。出于安全原因,Microsoft故意排除服务节点,但正确运行Delphi soap向导需要它。

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

最简单和最好的解决方案是使用THTTPReqResp组件。你甚至不需要这个智慧。您必须制作自己的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. 根据需要设置UserName和Password,或留空以使用登录用户的凭据。
  6. EWS使用soap 1.1,而非 1.2,因此请从WebNodeOptions中排除wnoSOAP12。
  7. 在线利用MSDN。这是一个极好的资源,有很多例子。
  8. (4)构建XML文档。

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

    这里有两种可能适合我的方式:

    1. 使用模板软件设计模式。例如,我使用的组件与TPageProducer非常相似。源是您的基本模板,您使用标签替换来实现您想要的结果。我的PageProducer版本可以定义在一个模板中标记的可选片段或重复n次的片段(每次迭代使用不同的数据)。
    2. 使用XSLT。这是最简单的解决方案。它几乎没有代码。
    3. 您可以使用以下两种方法,但我建议反对。并不是说它们不起作用,而只是技术太笨拙而且编码过多:

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