0

前段时间我一直在考虑如何从 Web 服务的默认页面中隐藏 IAppServer 和 IAppServerSOAP 接口以及默认显示的接口。我知道我的 Webservice 接口将这些接口作为祖先,但我认为在默认页面上“看到”这些接口是毫无意义的,因为客户端程序不直接使用它们。

有什么方法可以隐藏这些界面,只保留我们的界面和其他创建的界面吗?

4

4 回答 4

1

您应该能够更改服务返回的 WSDL。我认为有一个 WSDL 控件,您可以在其中覆盖 WSDL 响应以对其进行编辑或替换任何您想要的内容。

具体来说,将 TWSDLHTMLPublish 组件添加到您的 WebModule 表单。使用 OnBeforePublishingWSDL 编写您自己的 WSDL,如下所示:

procedure TWebModule2.WSDLHTMLPublish1BeforePublishingWSDL(
  const IntfName: WideString; var WSDL: WideString; var Handled: Boolean);
begin
  WSDL := '<foo>bar</foo>';
  Handled := true;
end;
于 2012-01-02T21:57:25.390 回答
1

谢谢卡洛斯!

但最后我找到了其他方法。. . 只需注销接口

InvRegistry.UnRegisterInterface(TypeInfo(IAppServer));
InvRegistry.UnRegisterInterface(TypeInfo(IAppServerSOAP));
InvRegistry.UnRegisterInterface(TypeInfo(IWSDLPublish));
于 2013-06-27T14:12:01.713 回答
0

如果您的客户端应用程序不需要服务器来实现 IAppServer(或 IAppServerSOAP),那么实现这些是没有意义的。我希望你已经实现了它们——正如你已经说过的——因为它们已经在你的对象的祖先中实现了——我希望它是 TSOAPDataModule。

因此,我建议不要将它们隐藏在 WSDL 中,而是从尚未引入 IAppServerxxxx 的类中降低服务器对象。这可能是简单的 TDataModule(如果您需要“容器”对象)或 TInvokableClass。

于 2012-02-06T21:03:50.947 回答
0

终于我明白了!

为此,我所要做的就是编辑 WebModule2DefaultHandlerAction 方法,即 DefaultHandler WebActionItem 的 OnAction 事件处理程序。

最终的事件处理程序现在看起来像这样:

procedure TWEBMWebService.WebModule2DefaultHandlerAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  Conteudo: String;
begin
  WSHPWebService.ServiceInfo(Sender, Request, Response, Handled);

  Conteudo := Response.Content;
  try
    HideInterfaces(Conteudo,['IAppServer','IAppServerSOAP']);
  finally
    Response.Content := Conteudo;
  end;
end;

HideInterfaces 过程如下:

procedure HideInterfaces(var aContent: String; aInterfaces: array of string);
var
  Intf: String;
  i: Integer;
begin
  if Length(aInterfaces) = 0 then
    Exit;

  with TStringList.Create do
    try
      { Remove todos os enters }
      aContent := StringReplace(aContent,#13#10,' ',[rfreplaceAll]);

      { Separa tudo baseando-se nos TR }
      Text := StringReplace(aContent,'<tr>',#13#10'<tr>'#13#10,[rfreplaceAll,rfIgnoreCase]);
      Text := StringReplace(Text,'</tr>',#13#10'</tr>'#13#10,[rfreplaceAll,rfIgnoreCase]);

      { Neste ponto, cada linha do StringList contém ou <TR>, ou </TR>, ou o que
      houver entre os dois, então circulamos por cada interface que precisa ser
      ocultada }
      for Intf in aInterfaces do
      begin
        for i := 0 to Pred(Count) do
          if Pos(LowerCase(Intf),LowerCase(Strings[i])) > 0 then
            Break;

        { Se achou a interface, oculta a linha inteira de tabela, removendo do
        StringList i, i-1 e i+1 }
        if i < Count then
        begin
          Delete(i+1);
          Delete(i);
          Delete(i-1);
        end;
      end;

      aContent := Text;
    finally
      Free;
    end;
end;

注释是葡萄牙语,抱歉,但代码很容易理解。如果您喜欢它并使用它,请告诉我并给我一些积分,对;)

我要感谢大家的宝贵答案。没有您的帮助,我永远找不到解决方案!谢谢你们!

于 2012-02-08T12:59:45.167 回答