0

しばらく前に、Web サービスのデフォルト ページから IAppServer および IAppServerSOAP インターフェイスを非表示にし、デフォルトで表示する方法について考えていました。私の Webservice インターフェースがこれらのインターフェースを祖先として持っていることは知っていますが、クライアント プログラムはこれらのインターフェースを直接使用しないため、デフォルト ページでこれらのインターフェースを「見る」ことは無意味だと思います。

これらのインターフェイスを非表示にして、作成されたインターフェイスやその他のインターフェイスを保持する方法はありますか?

4

4 に答える 4

1

ありがとうカルロス!

しかし、最終的に私は他のアプローチを見つけました。. . インターフェースの登録を解除するだけです

InvRegistry.UnRegisterInterface(TypeInfo(IAppServer));
InvRegistry.UnRegisterInterface(TypeInfo(IAppServerSOAP));
InvRegistry.UnRegisterInterface(TypeInfo(IWSDLPublish));
于 2013-06-27T14:12:01.713 に答える
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 に答える
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 に答える