2011-09-18 74 views
4

我想創建一個小工具,將監視多少帶寬我已經使用了多少我從我的ISP剩餘。他們有一個SOAP服務,我必須對我的用戶名和密碼進行身份驗證並驗證客戶端,然後我將得到2個必須傳遞給函數的GUID,該函數將從數組中返回使用統計信息。然後這些緩存1小時,我必須再次驗證。如何驗證此HTTPS SOAP服務?

我從內德爾福2010年使用WSDL進口商和它產生了我一個單位。 (我不確定我應該發佈這個,因爲它相當大)?

我想用我的用戶名和密碼與下面的代碼的第一部分驗證:

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的最終接收者是在消息中需要但不存在。

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; 

這總是會生成以下錯誤:

無法檢索服務的URL端點


我已經使用WSDLLocation而是與服務和端口嘗試/端口 'ServiceEngine' 從WSDL/'ServiceEngineSoap' 'https://webservices.zen.co.uk/broadband/v3.11/serviceengine.asmx?WSDL'


我在做什麼錯在這裏?如果我真的應該發送一個標題,那麼我將如何做到這一點,以驗證自己的服務?

+0

請張貼由WSDL進口商產生的單位,我認爲它會有所幫助。 – Sam

+0

我剛剛嘗試編輯我的問題以包含單元,但它太長了:主體被限制爲30000個字符;你輸入了53992 – Shambhala

回答

3

按照docs

如果服務器要求身份驗證,使用 THTTPReqResp對象的屬性,以提供必要的信息

它在您設置的用戶THTTPReqResp對象/ pw(HTTPRIO1.HTTPWebNode.UserName:='xxx'; HTTPRIO1.HTTPWebNode.Password:='yyy')

另請注意,關於使用HTTPS的文檔:

THTTPReqResp使用WinInet的建立到服務器的連接。 Wininet.dll必須安裝在客戶端系統上。 wininet.dll文件是 在Windows系統目錄中找到,如果你有IE3或安裝 更高。 WinInet的優點是它提供對 安全連接(https)的支持。要使用的WinInet,編譯項目 沒有USE_INDY符號定義

但是,它看起來像這樣用戶/密碼只可在代理的情況按照以下後使用。按照讓 - 瑪麗·巴伯的鏈接,從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; 
+0

謝謝你的迴應。什麼是GetWSToken?我已經添加了wininet,但是我找不到很多信息。它是未聲明的標識符。 – Shambhala

+0

GetWSToken看起來像一個自定義實現的實用程序方法...您只需將其替換爲需要查找用戶/ pw所需的任何方法即可。 –