2012-07-31 15 views
7

我已经使用WSDL导入程序与德尔福XE2,它已生成一个例程,看起来像下面,不包括我试图使用代理服务器的3条评论线。德尔福THTTPRio如何使用身份验证代理服务器

function GetIXYZService(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IXYZService; 
const 
    defWSDL = 'https://server/XYZService.svc?wsdl'; 
    defURL = 'https://server/XYZService.svc'; 
    defSvc = 'Company.XYZ.Services.XYZService'; 
    defPrt = 'BasicHttpBinding_IXYZService'; 
var 
    RIO: THTTPRIO; 
begin 
    Result := nil; 
    if (Addr = '') then 
    begin 
    if UseWSDL then 
     Addr := defWSDL 
    else 
     Addr := defURL; 
    end; 
    if HTTPRIO = nil then 
    RIO := THTTPRIO.Create(nil) 
    else 
    RIO := HTTPRIO; 
    try 
    // RIO.HTTPWebNode.Proxy := 'server_ip:port'; 
    // RIO.HTTPWebNode.Username := 'username'; 
    // RIO.HTTPWebNode.Password := 'password'; 

    Result := (RIO as ISSOService); 
    if UseWSDL then 
    begin 
     RIO.WSDLLocation := Addr; 
     RIO.Service := defSvc; 
     RIO.Port := defPrt; 
    end else 
     RIO.URL := Addr; 
    finally 
    if (Result = nil) and (HTTPRIO = nil) then 
     RIO.Free; 
    end; 
end; 

我需要通过身份验证代理服务器访问服务。我添加了上面显示的3行,当我取消注释时,我无法连接。对于THTTPRIO各国帮助...

如果你需要使用代理服务器,或者如果服务器要求身份验证 ,使用THTTPReqResp对象,它是 的HTTPWebNode属性的值提供的属性必要的 信息。

这我都做了,但是当我试图用我的服务的ESOAPHTTPException升高有消息...

Unauthorized (407) - 'https://server/XYZService.svc' 

我已经在这个职位上说,后设置的代理设置绊倒设置我试过的WSDLLocation,Service和Port,但没有成功。

http://www.delphigroups.info/2/10/555621.html

我也不会定义USE_INDY建设。我的服务使用SSL,因此我使用WinInet。

我不确定这种方法有什么问题,所以任何帮助表示赞赏。

感谢, 迈克尔

回答

2

this,有2种方式来设置代理授权WININET。我在Soap.SOAPHTTPTrans的源代码中没有看到任何HTTP_STATUS_PROXY_AUTH_REQ,所以您可能必须编写自己的错误处理。为此,请设置THTTPReqResp.OnWinInetError处理程序并处理HTTP_STATUS_PROXY_AUTH_REQ错误代码。

或者您可以尝试捕获THTTPReqResp的OnBeforePost并使用base64编码的一对登录名和密码调用HttpAddRequestHeaders。 希望它有帮助。

相关问题