前段时间我一直在考虑如何隐藏Web服务的默认页面IAppServer和IAppServerSOAP接口以及默认显示的界面。我知道我的Webservice接口将这些接口作为祖先,但我相信在默认页面上“看到”这些接口毫无意义,因为客户端程序不直接使用它们。
有没有办法隐藏这些界面,只保留我们的界面和其他创建的界面?
答案 0 :(得分: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;
答案 1 :(得分:1)
谢谢卡洛斯!
但最后我发现了其他方法。 。 。只需取消注册界面
InvRegistry.UnRegisterInterface(TypeInfo(IAppServer));
InvRegistry.UnRegisterInterface(TypeInfo(IAppServerSOAP));
InvRegistry.UnRegisterInterface(TypeInfo(IWSDLPublish));
答案 2 :(得分:0)
如果您的客户端应用程序不需要服务器来实现IAppServer(或IAppServerSOAP),那么实现它们是没有意义的。我希望你已经实现了它们 - 正如你已经说过的那样 - 因为它们已经在你的对象的祖先中实现了 - 我希望它是TSOAPDataModule。
因此,我建议从一个尚未引入IAppServerxxxx的类中删除服务器对象,而不是将它们隐藏在WSDL中。这可能是简单的TDataModule(如果你需要一个“容器”对象)或TInvokableClass。
答案 3 :(得分: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;
评论是葡萄牙语,对不起,但很容易理解代码。如果您喜欢并使用它,请告诉我并给我一些学分,对吧;)
我要感谢大家的宝贵答案。没有你的帮助,我永远找不到解决方案!谢谢大家!