4

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

默认情况下,Delphi 在服务名称中添加“服务”。是否可以覆盖它?

在 TWebServEx.GenerateWSDL 方法(Soap.WebServExp,第 261 行)中添加了“服务”。

4

2 回答 2

6

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

procedure TMyWebModule.WSDLHTMLPublishAfterPublishingWSDL(const WSDLDoc: IWSDLDocument);
begin
  WSDLDoc.Definition.Attributes[SName] := 'MyServiceName';
end;
于 2012-09-03T13:47:29.270 回答
0

非常抱歉,您无法通过程序接口改变库的这种行为。它被硬编码在 Soap.WSDLIntf ( const SService = 'service';) 单元中。如果您正在使用

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

您在 XML 标头中获得标记"name = MyServiceName",但导出服务名称仍将带有“服务”添加。

解决方案是重建 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 不兼容的类型:'Boolean' 和 'Truncated'”,通常它可能发生在项目的 dpr 文件中,请添加前缀“system”。为布尔常量“true”或“false”,例如: Result := system.True;
  7. 享受。
于 2018-09-04T06:48:14.553 回答