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

4
我正在使用Delphi XE2创建webservice应用程序。但是根据外部规范,我需要定义服务名称。
默认情况下,Delphi会在服务名称中添加“service”。是否可以覆盖这个设置?
在TWebServEx.GenerateWSDL方法(Soap.WebServExp,第261行)中添加了“service”。
2个回答

6

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

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

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. 在 Soap.WSDLIntf 中查找 const 部分中的行 SService = 'service';
  3. 将其替换为:

    {$IFDEF TRUNCATE_WSDL_EXTERNAL_NAME }
    SService = ''; 
    {$ELSE }
    "SService = 'service';
    {$ENDIF }
    
  4. 将定义名称 TRUNCATE_WSDL_EXTERNAL_NAME 添加到您的项目中。

  5. 将 %DELPHIDIR%\Source\soap 中的所有文件添加到您的项目中。
  6. 重新构建您的应用程序。如果收到一些错误“E2010 Incompatible types: 'Boolean' and 'Truncated'”,通常会发生在您的项目的 dpr 文件中,请在布尔常量“true”或“false”前加上前缀“system.”,例如: Result := system.True;
  7. 享受吧。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接