移植 Delphi 2010 应用程序 soap webservice 使用 wininet 到 winhttp

Porting Delphi 2010 application soap webservice using wininet to winhttp

我们目前正在 XP 上的 delphi 应用程序 运行 中使用基于 soap 的网络服务(是的,仍然是 运行 XP)并移植到 windows 8.1 OS。我们当前的实现还使用 CAPICOM 进行证书管理,现在也不再支持了。

我们计划从 wininet 升级到 winhttp(速度更快),并保留 Delphi 2010 的当前版本。我发现的组件是:SynCrtSock、ICS 和 Indy。根据我的评论,这些要么使用 wininet,要么不支持 soap?

任何关于至少包含以下组件和示例的信息:soap 支持、winhttp 和证书管理将不胜感激。

提前致谢。

我现在已经解决了证书管理问题的关键点,我想我会post我的解决方案。

证书管理要求仅限于附加到 SOAP 消息,我可以使用 wcrypt2 库实现解决方案。我使用 CAPICOM 的原始代码(在许多互联网搜索的帮助下)是

   Certificate1.Load(CertFile, certpword, CAPICOM_KEY_STORAGE_DEFAULT,
    CAPICOM_CURRENT_USER_KEY);
  Cert2 := Certificate1.DefaultInterface;
  CertContext := Cert2 as ICertContext;
  CertContext.Get_CertContext(Integer(PCertContext));
  if internetsetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT,
    PCertContext, SizeOf(CERT_CONTEXT)) = False then
  begin
    'Error Handling'
  end;

通过使用 wcrypt2,我能够从证书存储中读取并通过使用

对我的 BeforePost 函数进行简单更改来附加到 soap 消息
hMyStore:=CertOpenSystemStore(0,'MY');
pCertContext:=CertFindCertificateInStore(
  hMyStore,
  X509_ASN_ENCODING,
  0,
  CERT_FIND_SUBJECT_STR,
  PCHAR('KeyName'),Nil
  );

  if internetsetOption(Data, INTERNET_OPTION_CLIENT_CERT_CONTEXT,
        PCertContext, SizeOf(CERT_CONTEXT)) = False then
  begin
    'error handling'
  end;

现在我与 Windows 8.1 兼容,因为 wininet 仍然与 8.1 兼容,这不在我的关键路径上,并且有更多时间部署解决方案。

如果您对我的解决方案有任何进一步的建议,我们将不胜感激。