Как скрыть стандартные интерфейсы со страницы по умолчанию WebService - PullRequest
0 голосов
/ 03 января 2012

Некоторое время назад я думал о том, как скрыть со страницы по умолчанию веб-службы интерфейсы IAppServer и IAppServerSOAP, которые отображаются по умолчанию. Я знаю, что мой интерфейс Webservice имеет эти интерфейсы как предки, но я считаю, что бессмысленно «видеть» эти интерфейсы на странице по умолчанию, поскольку клиентские программы не используют их напрямую.

Есть ли способ скрыть эти интерфейсы и просто сохранить наш интерфейс и другие, которые были созданы?

Ответы [ 4 ]

1 голос
/ 27 июня 2013

Спасибо, Карлос!

Но, наконец, я нашел другой подход.,,просто отмените регистрацию интерфейса

InvRegistry.UnRegisterInterface(TypeInfo(IAppServer));
InvRegistry.UnRegisterInterface(TypeInfo(IAppServerSOAP));
InvRegistry.UnRegisterInterface(TypeInfo(IWSDLPublish));
1 голос
/ 03 января 2012

Вы сможете изменить 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;
0 голосов
/ 08 февраля 2012

Наконец я понял!

Для этого все, что мне нужно было сделать, - это отредактировать метод WebModule2DefaultHandlerAction, то есть обработчик события OnAction для DefaultHandler WebActionItem.

Теперь обработчик финального события выглядит следующим образом:

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;

Комментарии на португальском языке, извините, но код легко понять. Если вам это нравится и вы им пользуетесь, пожалуйста, дайте мне знать и дайте мне кредиты, верно;)

Я хотел бы поблагодарить вас всех за ценные ответы. Без вашей помощи я бы никогда не нашел решение! Спасибо всем!

0 голосов
/ 07 февраля 2012

Если вашим клиентским приложениям не требуется сервер для реализации IAppServer (или IAppServerSOAP), то реализовывать это бессмысленно. Я ожидаю, что вы реализовали их - как вы уже сказали - потому что они уже реализованы в предках ваших объектов - я ожидаю, что это TSOAPDataModule.

Таким образом, вместо того, чтобы скрывать их в WSDL, я бы предложил исключить объекты вашего сервера из класса, который еще не представляет IAppServerxxxx. Это может быть простой TDataModule (если вам нужен объект-контейнер) или TInvokableClass.

...