如何使用Delphi XE2覆盖WSDL中的服务名称?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Delphi XE2覆盖WSDL中的服务名称?相关的知识,希望对你有一定的参考价值。

我正在使用Delphi XE2来创建webservice应用程序。但是我需要根据外部规范定义服务名称。

Delphi默认将“服务”添加到服务名称。有可能覆盖这个吗?

'service'在TWebServEx.GenerateWSDL方法中添加(Soap.WebServExp,第261行)。

答案

您可以使用OnAfterPublishingWSDL组件的TWSDLhtmlPublish事件来更改服务名称:

procedure TMyWebModule.WSDLHTMLPublishAfterPublishingWSDL(const WSDLDoc: IWSDLDocument);
begin
  WSDLDoc.Definition.Attributes[SName] := 'MyServiceName';
end;
另一答案

很抱歉,你不能通过程序界面改变库的行为。它是在单元Soap.WSDLIntf(const SService = 'service';)中硬编码的。如果你正在使用

    procedure TMyWebModule.WSDLHTMLPublishAfterPublishingWSDL(const WSDLDoc: IWSDLDocument);
    begin
       WSDLDoc.Definition.Attributes[SName] := 'MyServiceName';
    end;

您在XML标头中获取标签"name = MyServiceName",但导出服务名称仍将添加“service”。

解决方案是重建Delphi SOAP库。

  1. 更改文件夹%DELPHI DIR% Source soap的安全设置,以允许域用户进行读/写。
  2. SService = 'service';部分的Soap.WSDLIntf行const中查找。
  3. 替换为: {$IFDEF TRUNCATE_WSDL_EXTERNAL_NAME } SService = ''; {$ELSE } "SService = 'service'; {$ENDIF }
  4. 将定义名称TRUNCATE_WSDL_EXTERNAL_NAME添加到项目中。
  5. 将%DELPHIDIR% Source soap中的所有文件添加到项目中。
  6. 重建您的应用程序。如果您收到一些错误“E2010不兼容类型:'布尔'和'截断'”,通常它可能发生在项目的dpr文件中,添加前缀“system”。布尔常量“true”或“false”,例如:Result := system.True;
  7. 请享用。

以上是关于如何使用Delphi XE2覆盖WSDL中的服务名称?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi XE2:跳到 CHM 中的锚点?

如何在Delphi中导入wsdl文件离线?

使用 Delphi XE2 的 AnimateWindow

如何从 Delphi XE2 加速文字自动化

如何改变delphi xe2编程环境下所显示的源代码的字体大小

Delphi XE2 中 MessageDlg 问题