2010-02-18 9 views
6

Bir delphi programında (hizmet olarak çalışıyor) bazı web servislerini çağırmam gerekir.
Temel Kimlik Denetimleri gerekli değilse, çağrılar düzgün çalışır. Webservice çağrısı sırasında iletişim kutusu (Temel Kimlik Doğrulama istemi) nasıl engellenir?

InternetSetOption(Data, INTERNET_OPTION_USERNAME,... 
InternetSetOption(Data, INTERNET_OPTION_PASSWORD,... 

Ama Temel Kimlik Doğrulama requeried ve kullanıcı adı olup olmadığını/şifre sağlanmaz

program af istemini getirir: Temel Kimlik Doğrulama requerired ve kullanıcı adı/şifre kullanılarak (BeforePost cinsinden) sağlanırsa aramalar da gayet iyi çalışıyor kullanıcı adı/parola (bir servisteki NO-GO).

Nasıl bir istem istemediğimi nasıl işaret edebilirim, bunun yerine bir hata mı?

Sorun şu ki, SOAPHTTPTrans işlevinde THTTPReqResp.Send (const ASrc: TStream): Tamsayı; (satır 762 (InternetErrorDlg i yöntemine ikinci çağrı)).

Edit1: i INTERNET_FLAG_NO_AUTH içerecek şekilde (SOAPHTTPTRANS olarak) gönderme yönteminin başında Flags değiştirirseniz i istediği gibi
işe yarıyor.
Ancak bunu SAOPHTTPTrans'ı değiştirmeden nasıl yapabilirim (mümkünse)?

EDIT2: AvailabilityServiceSoap WSDL ileti kullanılarak oluşturulan bir arayüz

ws := THTTPRIO.Create(Self); 
ws.URL := 'http://excample.com/ws.asmx'; 
ws.HTTPWebNode.InvokeOptions := [soIgnoreInvalidCerts]; 
ws.HTTPWebNode.OnBeforePost := WebServiceCallBeforePost; 
AvailabilityWebservice := (ws as AvailabilityServiceSoap); 
sTemp := AvailabilityWebservice.GetVersion; 

.

+0

benzer bir başlığı varsa görebiliyordu? Bu mevcut davranışı bir hataya dönüştürebilir. –

+0

THTTPReqResp Nesnesini nasıl kullanıyorsunuz? TSOAPConnection'un bir parçası olarak? –

+0

Jeroen: Henüz denemedim, ama sorun işlem stoğunun girdi beklemesidir, bu yüzden hangig olarak görülüyor. – BennyBechDk

cevap

1

THTTPReqResp kaynağından gelen ve kendi yönteminizi ekleyebilmeniz için gönderme yöntemini geçersiz kılan yeni bir sınıf oluşturabilirsiniz. Yeni sınıfı kullanarak ws.HTTPWebNode'u yeni bir düğüme ayarlayabilmeniz gerekir. Bir web filtre ile Windows Live Messenger çalışmasına izin çalışırken

şey

ws := THTTPRIO.Create(Self); 
MyNewNode := MyNewClass.Create; 
ws.HTTPWebNode := MyNewNode; 
ws.URL := 'http://excample.com/ws.asmx'; 
ws.HTTPWebNode.InvokeOptions := [soIgnoreInvalidCerts]; 
ws.HTTPWebNode.OnBeforePost := WebServiceCallBeforePost; 
AvailabilityWebservice := (ws as AvailabilityServiceSoap); 
sTemp := AvailabilityWebservice.GetVersion; 
+0

İşe yarayan bir çözüm gibi görünüyor, sadece 170 satırını THTTPReqResp.Send'den kopyalamak zorunda kalmıyorum. Yani eğer bu kodu kopyalamadan herhangi bir yolu varsa bunu başarırsanız daha iyi görünür. – BennyBechDk

+0

Gönderme yöntemini kendi nesnesine kopyalamayı denedim, ancak birçok özel değişken kullanıldı. Böylece tüm ünitenin çalışmasını sağladım ve kopyalanmalı ve değiştirilmelidir. – BennyBechDk

+0

Onbeforepost'ta neler oluyor? Bunu gösterdiğinizden ve muhtemelen orada InternetSetOption'u çağırmanız gerektiğini bildiğimden beri, bunu göstermesi daha iyi bir yanıt olurdu. –

2

gibi ben bu sorunu vardı.

Her sık ​​sık otomatik olarak doğrulayan bir small program yazmayı bitirdim. Umarım bu da size yardımcı olur umarım.

uses 
    ... IdHTTP ...; 

... 
var 
    httpGetter: TIdHTTP; 
...  
httpGetter.Request.Username := username; 
httpGetter.Request.Password := password; 
httpGetter.HandleRedirects := True; 
httpGetter.Request.BasicAuthentication := True; 

//custom useragent required to let live messenger work 
//this part is probably not necessary for your situation 
httpGetter.Request.UserAgent := 'MSN Explorer/9.0 (MSN 8.0; TmstmpExt)'; 

httpGetter.Get(url,MS); 
... 
+0

Sorunu çözmemek lazım. Sorun, kullanıcı adı ve şifrenin girilmemesi durumunda, programın bir bekleyişini bekler (ve gözetimsiz bir sunucuda bir hizmet olarak çalışır, bu tanrı değildir). Bir hatayı alıp başka bir hata gibi ele almaktan mutlu olacağım. – BennyBechDk

1

Önce sunucu kimlik doğrulama modunu denetlemeye ne dersiniz?

http://en.wikipedia.org/wiki/Basic_access_authentication

  • istemci kimlik doğrulaması gerektiriyor ama bir kullanıcı adı ve parola sağlamadığını bir sayfa sorar. Tipik olarak bunun nedeni, kullanıcının kullanıcısının adresi girmesi veya sayfasını takip etmesidir.
  • Sunucu, 401 yanıt koduyla yanıt verir ve kimlik doğrulama gerçeklemesini sağlar.

Yani müşteri hizmetleri uygulaması Get göndermek ve yanıt masaüstü etkileşimi olmadan hizmetinizi çalıştırılamıyor

WW-Authenticate: Basic realm="Secure Area"