2010-02-18 13 views
6

के कॉल के दौरान संवाद (मूल प्रमाणीकरण संकेत) को रोकने के लिए कैसे करें एक डेल्फी प्रोग्राम (सेवा के रूप में चल रहा है) में मुझे कुछ वेबसाइसेस कॉल करने की आवश्यकता है।
यदि मूल प्रमाणीकरण की आवश्यकता नहीं है तो कॉल ठीक काम करता है। कॉल भी ठीक काम करता है, तो मूल प्रमाणीकरण requerired जाता है और उपयोगकर्ता नाम/पासवर्ड प्रदान की जाती है (BeforePost में) का उपयोग:वेबसाइट सेवा

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

लेकिन अगर बुनियादी प्रमाणीकरण Requeried, और उपयोगकर्ता नाम है/पासवर्ड प्रदान नहीं की है, कार्यक्रम वायुसेना शीघ्र लाता है उपयोगकर्ता नाम/पासवर्ड के लिए (एक servcice में नो-गो है)।

तो मैं कैसे संकेत दे सकता हूं कि मुझे कोई संकेत नहीं चाहिए, बल्कि इसके बजाय एक त्रुटि?

समस्या यह है कि, जैसा कि मैं इसे कर सकता हूं, SOAPHTTPTrans फ़ंक्शन THTTPReqResp.Send (const ASrc: TStream): Integer; (लाइन 762 (इंटरनेट एरर डीएलजी मैं दूसरी विधि के लिए दूसरी कॉल))।

EDIT1:
अगर मैं (SOAPHTTPTRANS में) भेजने विधि की शुरुआत में झंडे को बदलने INTERNET_FLAG_NO_AUTH शामिल करने के लिए, यह काम करता है के रूप में मैं चाहता था।
लेकिन मैं SAOPHTTPTrans (यदि संभव हो) को बदले बिना ऐसा कैसे करूं?

EDIT2:

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; 

कहाँ AvailabilityServiceSoap डबल्यूएसडीएल आयातक उपयोग करते हुए उत्पन्न इंटरफेस है।

+0

प्रकार से हैडर है यदि आप डेस्कटॉप सहभागिता के बिना आपकी सेवा कार्य नहीं किया जा सकता सकता है? यह वर्तमान व्यवहार को एक त्रुटि में बदल सकता है। –

+0

आप THTTPReqResp ऑब्जेक्ट का उपयोग कैसे कर रहे हैं? टीएसओएपी कनेक्शन के हिस्से के रूप में? –

+0

जेरोन: मैंने अभी तक कोशिश नहीं की है, लेकिन समस्या यह है कि प्रोसेस स्टॉक इनपुट के लिए इंतजार कर रहा है, इसलिए यह लटकने वाला लगता है। – BennyBechDk

उत्तर

1

आप एक नई कक्षा बना सकते हैं जो THTTPReqResp से प्रवेश करता है और प्रेषण विधि को ओवरराइड करता है ताकि आप अपने स्वयं के ध्वज शामिल कर सकें। आप नई कक्षा का उपयोग कर ws.HTTPWebNode को एक नए नोड पर सेट करने में सक्षम होना चाहिए।

कुछ

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

यह एक व्यावहारिक समाधान की तरह लगता है, मुझे बस THTTPReqResp.Send से 170 लाइनों की प्रतिलिपि बनाना पसंद नहीं है। तो अगर उस कोड को कॉपी किए बिना इसे प्राप्त करने का कोई तरीका है तो यह बेहतर लगता है। – BennyBechDk

+0

मैंने अपनी विधि को भेजें विधि की प्रतिलिपि बनाने की कोशिश की, लेकिन कई निजी चरों का उपयोग किया गया। तो इसे पूरा करने के लिए पूरी इकाई को कॉपी और संशोधित किया जाना चाहिए। – BennyBechDk

+0

ऑनबेनपोस्ट में क्या चल रहा है? चूंकि आप इसे दिखा रहे हैं, और जब से मुझे पता चल जाता है कि आपको शायद इंटरनेटसेटऑपशन को कॉल करने की आवश्यकता है, तो यह दिखाए जाने पर बेहतर जवाब होगा। –

2

जैसे कि मैंने जब एक वेब फिल्टर के माध्यम से विंडोज लाइव मैसेंजर काम करने देने के लिए कोशिश कर रहा है इस समस्या थी।

मैंने small program लिखना समाप्त कर दिया जो हर बार स्वतः प्रमाणीकृत करता है।

आशा है कि इससे आपको भी मदद मिलेगी।

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

यह समस्या हल नहीं है। समस्या तब होती है जब उपयोगकर्ता नाम और पासवर्ड दर्ज नहीं किया जाता है, प्रोग्राम एक प्रॉम्प्ट प्रदर्शित करता है (और एक अनुपयुक्त सर्वर पर एक सेवा के रूप में चल रहा है, यह भगवान नहीं है)। मुझे एक त्रुटि प्राप्त करने में खुशी होगी, और किसी अन्य त्रुटि की तरह इसे संभालना होगा। – BennyBechDk

1

पहले सर्वर प्रमाणीकरण मोड की जांच कैसे करें?

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

  • ग्राहक एक पेज के लिए पूछता है कि प्रमाणीकरण की आवश्यकता है लेकिन एक उपयोगकर्ता नाम और पासवर्ड प्रदान नहीं करता है। आमतौर पर ऐसा इसलिए होता है क्योंकि उपयोगकर्ता बस पते दर्ज किया गया है या पृष्ठ के एक लिंक के बाद।
  • सर्वर 401 प्रतिक्रिया कोड के साथ प्रतिक्रिया करता है और प्रमाणीकरण क्षेत्र प्रदान करता है।

तो ग्राहक सेवा आवेदन एक प्राप्त भेजने के लिए और देखने प्रतिक्रिया

WW-Authenticate: Basic realm="Secure Area" 
संबंधित मुद्दे