我正在尝试创建一个小工具来监控我使用了多少带宽以及我从ISP获得了多少带宽。他们有一个SOAP服务,我必须验证我的UserName和密码并验证客户端,然后我将得到2个GUID,必须传递给将从数组返回使用情况统计信息的函数。然后将它们缓存1小时,我必须再次进行身份验证。
我在Delphi 2010中使用过WSDL Importer,它为我生成了一个单元。 (我不确定我应该发布它,因为它非常大)?
我正在尝试使用以下代码使用我的用户名和密码验证第一部分:
procedure TForm1.btnAuthClick(Sender: TObject);
var
fGUID: string;
begin
HTTPRIO1.URL := 'https://webservices.zen.co.uk/broadband/v3.11/serviceengine.asmx?WSDL';
try
fGUID := (HTTPRIO1 as ServiceEngineSoap).Authenticate(edtUserName.Text,edtPassword.Text);
Label1.Caption := fGUID;
except
on E: Exception do
Memo1.Lines.Text := E.Message;
end;
end;
以上代码始终返回以下错误:
最终收件人的标头http://schemas.xmlsoap.org/ws/2004/08/addressing:Action是必需的,但不会出现在邮件中。
我尝试使用WSDLLocation代替服务和端口:
procedure TForm1.btnAuthClick(Sender: TObject);
var
fGUID: string;
begin
HTTPRIO1.WSDLLocation := 'https://webservices.zen.co.uk/broadband/v3.11/serviceengine.asmx?WSDL';
HTTPRIO1.Service := 'ServiceEngine';
HTTPRIO1.Port := 'ServiceEngineSoap';
try
fGUID := (HTTPRIO1 as ServiceEngineSoap).Authenticate(edtUserName.Text,edtPassword.Text);
Label1.Caption := fGUID;
except
on E: Exception do
Memo1.Lines.Text := E.Message;
end;
end;
这将始终生成以下错误:
无法从WSDL'https://webservices.zen.co.uk/broadband/v3.11/serviceengine.asmx?WSDL'
我在这里做错了什么?如果我实际上应该发送一个标题,那么我该如何做这个来验证自己的服务呢?
答案 0 :(得分:4)
根据docs
如果服务器需要身份验证,请使用该属性 THTTPReqResp对象提供必要的信息
您在THTTPReqResp对象中设置了user / pw(HTTPRIO1.HTTPWebNode.UserName:='xxx'; HTTPRIO1.HTTPWebNode.Password:='yyy')
另请参阅有关使用HTTPS的文档:
THTTPReqResp使用WinInet建立与服务器的连接。 必须在客户端系统上安装Wininet.dll。 wininet.dll是 如果您有IE3或更高版本,请在Windows系统目录中找到 安装。 WinInet的优势在于它提供了支持 安全连接(https)。要使用WinInet,请编译您的项目 没有定义USE_INDY符号
但是,根据下面的帖子,看起来这个用户/ pw可能只在代理情况下使用。请关注Jean-Marie Babet与2007年给出的原始解决方法的链接,如果他们仍然没有解决这个问题:
https://forums.codegear.com/thread.jspa?threadID=58755&tstart=0
以下是解决方法:
您所要做的就是处理OnBeforePost事件 HTTPRIO.HTTPWebNode组件并使用InternetSetOption。这是一个 示例来自与MapPoint对话的示例(MapPoint.NET使用 '摘要'身份验证 - “基本”身份验证的一种变体:
procedure TTestMapPointRender.HTTPRIO1HTTPWebNode1BeforePost(
const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
UserName: string;
PassWord: string;
begin
UserName := GetWSToken('MapPoint', 'UserName');
Password := GetWSToken('MapPoint', 'Password');
if not InternetSetOption(Data,
INTERNET_OPTION_USERNAME,
PChar(UserName),
Length(UserName)) then
raiseException(SysErrorMessage(GetLastError));
if not InternetSetOption(Data,
INTERNET_OPTION_PASSWORD,
PChar(Password),
Length (Password)) then
raiseException(SysErrorMessage(GetLastError));
end;