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

时间:2012-09-03 12:38:57

标签: delphi soap wsdl

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

很抱歉,但是您不能通过程序接口更改库的行为。它在单元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. 更改文件夹%DELPHIDIR%\ 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文件中发生,请添加前缀“系统”。布尔常量“ true”或“ false”,例如: Result := system.True;
  7. 享受。
相关问题