如何对此HTTPS SOAP服务进行身份验证?

Sha*_*ala 6 delphi https soap

我正在尝试创建一个小工具来监控我使用了多少带宽以及我从ISP获得了多少带宽.他们有一个SOAP服务,我必须验证我的UserName和密码并验证客户端,然后我将得到2个GUID,必须传递给将从数组返回使用情况统计信息的函数.然后将它们缓存1小时,我必须再次进行身份验证.

我在Delphi 2010中使用了WSDL Importer,它为我生成了一个Unit.(我不确定我应该发布它,因为它非常大)?

我正在尝试用我的用户名和密码验证第一部分,代码如下:

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;
Run Code Online (Sandbox Code Playgroud)

上面的代码总是返回以下错误:

标题http://schemas.xmlsoap.org/ws/2004/08/addressing:最终收件人的操作是必需的,但不在消息中.


我尝试使用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; 
Run Code Online (Sandbox Code Playgroud)

这将始终生成以下错误:

无法从WSDL"https://webservices.zen.co.uk/broadband/v3.11/serviceengine.asmx?WSDL"中检索服务/端口"ServiceEngine"/"ServiceEngineSoap"的URL端点


我在这做错了什么?如果我实际上应该发送一个标题,那么我该如何做这个来验证自己的服务?

Dar*_*ler 4

根据文档

如果服务器需要身份验证,请使用 THTTPReqResp 对象的属性来提供必要的信息

您可以在 THTTPReqResp 对象中设置用户/密码(HTTPRIO1.HTTPWebNode.UserName := 'xxx'; HTTPRIO1.HTTPWebNode.Password := 'yyy')

另请注意文档中有关使用 HTTPS 的信息:

THTTPReqResp 使用 WinInet 建立与服务器的连接。Wininet.dll 必须安装在客户端系统上。如果您安装了 IE3 或更高版本,则可以在 Windows 系统目录中找到 wininet.dll。WinInet 的优点是它提供对安全连接 (https) 的支持。要使用 WinInet,请在不定义 USE_INDY 符号的情况下编译项目

然而,根据下面的帖子,这个用户/密码似乎只能在代理情况下使用。如果 Jean-Marie Babet 仍未修复此问题,请点击 2007 年给出的原始解决方法的链接:

https://forums.codegear.com/thread.jspa?threadID=58755&tstart=0

这是解决方法:

您所要做的就是处理 HTTPRIO.HTTPWebNode 组件上的 OnBeforePost 事件并使用 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;
Run Code Online (Sandbox Code Playgroud)