2011-11-18 12 views
7

हमारे पास एक डेल्फी एक्सई एप्लिकेशन है जो SOAP (THTTPRIO आदि) संचार का उपयोग करता है जो (डेल्फी में) WinInet.dll पर डिफ़ॉल्ट रूप से काम करता है। हमने प्रमाणीकरण कोड को ठीक किया है ताकि यह https प्रमाणीकरण का उपयोग कर काम करता है, और जब https के लिए उपयोगकर्ता नाम और पासवर्ड सही होता है, तो सब कुछ ठीक है।डेल्फी साबुन https प्रमाणीकरण विफलता एक संवाद बॉक्स पॉप अप करता है

समस्या यह है कि जब प्रमाणीकरण विवरण गलत हैं, तो आपको Windows से एक संदेश बॉक्स मिलता है, जो शायद WinInet.dll द्वारा पॉप अप किया जा रहा है। मैं उस संवाद बॉक्स को दूर करना चाहता हूं। मैं यह नहीं समझ सकता कि मेरे डेल्फी एसओएपी को कैसे बदला जाए ताकि पासवर्ड नहीं आएगा।

स्थिति निम्न तरीकों से different than this question है:

  1. मैं सभी चीजें हैं जो वह कर रहा है, InternetSetOption (...) बुला उपयोगकर्ता नाम और पासवर्ड सेट करने के लिए सहित कर रहा हूं।

  2. मैं एक स्व-हस्ताक्षरित प्रमाणपत्र वाले सर्वर का उपयोग नहीं कर रहा हूं, इसलिए इसलिए IgnoreInvalidCerts ध्वज मेरे मामले पर लागू नहीं है।

  3. किसी तरह, मैं मैं कुछ एपीआई यह पॉप अप करने के InternetErrorDlg यह है कि (विंडोज़ के कुछ संस्करणों का कहना है कि विंडोज सुरक्षा विकल्प) नहीं बताने के लिए WinInet में कॉल उपयोगकर्ता पूछने के लिए पॉप अप प्राप्त करने की आवश्यकता है।

  4. मेरे मामले में हमारे कॉन्फ़िगरेशन फ़ाइल में हमारे पास उपयोगकर्ता नाम और पासवर्ड का उपयोग किया जा रहा है, यह गलत है (पुराना है) और इसलिए हम चाहते हैं कि WinInet कोड डायलॉग बॉक्स को पॉप अप करने के बजाय बस एक त्रुटि लौटाए ।

शायद अन्य सवाल पुरुष वास्तव में यह पता लगाने की थी कि इसे कैसे किया, लेकिन उस सवाल पर विस्तार से वह यह कैसे किया देखने के लिए अपर्याप्त है। स्वीकृत उत्तर मेरे लिए काम नहीं करता है।

कुछ मृत समाप्त होता है मैं पालन किया है:

PLUGIN_AUTH_FLAGS_CAN_HANDLE_UI के लिए WinInet MSDN डॉक्स - कि बजाय एक प्लगइन के लिए, एक WinInet उपयोगकर्ता के लिए लागू होने के लिए प्रकट नहीं होता।

WinInet MSDN डॉक्स InternetSetOption पर चर्चा, और कुछ समाचार समूहों मेरा पीछा पर पहले पोस्ट ईवेंट हैंडलर कोड के लिए नेतृत्व किया है:

procedure TMyDevice.HTTPWebNodeOnBeforePost(
    const HTTPReqResp: SOAPHTTPTrans.THTTPReqResp; Data: Pointer); 
var 
SecurityFlagsLen:DWORD; 
SecurityFlags:DWORD; 
begin 
    { authentication, NTLM+HTTPS, WinInet authentication set via WinInet SET INTERNET OPTION API. 
    This approach recommended on newsgroups for https basic authentication. } 

    if fUserName<>'' then 
    if not InternetSetOption(Data, 
       INTERNET_OPTION_USERNAME, 
       PChar(fUserName), 
       Length(fUserName)) then 
    raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError)); 

    if fPassword<>'' then 
    if not InternetSetOption(Data, 
       INTERNET_OPTION_PASSWORD, 
       PChar(fPassword), 
       Length (fPassword)) then 
    raise EWebServiceAuthException.Create(SysErrorMessage(Windows.GetLastError)); 

     { possible type of hackage: WinInet Security option flags to stop password box? } 
    SecurityFlagsLen := SizeOf(SecurityFlags); 
     InternetQueryOption({Request}data, INTERNET_OPTION_SECURITY_FLAGS, 
     Pointer(@SecurityFlags), SecurityFlagsLen); 
     SecurityFlags := SecurityFlags or SECURITY_FLAG_something; 
     InternetSetOption({Request}data, INTERNET_OPTION_SECURITY_FLAGS, 
     Pointer(@SecurityFlags), SecurityFlagsLen); 
end; 

इस कोड पासवर्ड काम करता है, लेकिन जब उपयोगकर्ता की प्रवेश किया पासवर्ड गलत है , संदेश बॉक्स को पॉप अप करने के बजाय, मैं असफल होने के लिए एसओएपी कॉल कैसे प्राप्त करूं, या अपवाद उठा सकता हूं?

+0

आप 'INTERNET_OPTION_ERROR_MASK' में [' INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa385328 (v = vs.85) .aspx) की स्थापना ध्वज की कोशिश किया ? –

+0

वह ध्वज एक अतिरिक्त त्रुटि रिपोर्ट जोड़ता है, यह एक दूर नहीं लेता है। दिलचस्प बात यह है कि इसे WinInet.pas में परिभाषित नहीं किया गया है। –

उत्तर

2

WinHTTP घटक द्वारा WinINet को बदलें। दोनों के पास बहुत करीबी एपीआई हैं, और दूसरा यूआई इंटरैक्शन नहीं बनाता है, लेकिन किसी भी अन्य एपीआई की तरह त्रुटि कोड वापस कर देगा। WinINet का UI हिस्सा कुछ सॉफ़्टवेयर के लिए एक अच्छा विचार हो सकता है, लेकिन ऐसा लगता है जैसे आपकी आवश्यकताओं के अनुरूप नहीं है।

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384068(v=vs.85).aspx

बेशक

देखें, HTTPS और प्रमाणीकरण एक समान तरीके से नियंत्रित किया जाएगा। लेकिन आपको उपयोगकर्ता नाम और पासवर्ड के लिए संकेत देना होगा, और HTTP हेडर को अनुरोध के रूप में अपडेट करना होगा। this link देखें।

हमारे परीक्षणों से, WinHTTP WinINet से बहुत तेज है (निश्चित रूप से क्योंकि यह किसी भी यूआई भाग को लागू नहीं करता है, और यह इंटरनेट एक्सप्लोरर पुस्तकालयों से जुड़ा नहीं है)।

आप अनुमान लगाने के लिए our Open Source classes पर एक अनुमान लगा सकते हैं कि WinINet और WinHTTP के बीच API में अंतर कितना छोटा है (अधिकांश कोड लिंक किए गए इकाई में साझा किया जाता है)।

+0

मुझे लगता है कि WinHTTP का उपयोग करने के लिए हमें RTL SOAP कोड को कस्टम-हैक करना होगा। –

+0

या इसके बजाय WinHTTP API का उपयोग करने के लिए कक्षा का उपयोग कर WinINet को ओवरराइड करें? –

0

चुपचाप त्रुटि को संभालने के लिए SOAPHTTPTrans को संशोधित करने का प्रयास करें।

Result := CallInternetErrorDlg 

आप शायद अपने विशेष त्रुटि का पता लगा सकते हैं, तो आप कम से कम नहीं करने के लिए एक फोन करना HandleWinInetError से एक 0 वापस जाने के लिए सक्षम होना चाहिए, या: THTTPReqResp.HandleWinInetError में, वहाँ अंत में त्रुटि संवाद के लिए एक कॉल है CallInternetErrorDlg। देखें कि क्या मदद करता है।

+0

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

+0

क्या सभी कंप्यूटर (जिन पर आप परीक्षण कर रहे हैं) क्या इंटरनेट एक्सप्लोरर का एक ही संस्करण है? यह निर्धारित करता है कि आपके पास कौन सी WinInet DLL है। –

+0

विचित्र रूप से, सभी कंप्यूटरों में IE 8.0 है, कुछ XP हैं और कुछ Win7 हैं, और ऐसा लगता है कि XP ​​कंप्यूटर अलग हैं। –