2009-04-20 11 views
5

के तहत नहीं मिला है, मैं एक सुरक्षित कनेक्शन पर बैठे एक php-लिखित वेब सेवा में एक पोस्ट बनाना चाहता हूं। निम्न कोड केवल एक परीक्षण कंसोल ऐप है जिसे मैंने परीक्षण और त्रुटि के कुछ घंटों के बाद लिखा था। अनिवार्य रूप से, मुझे HttpWebRequest का उपयोग करने के लिए कुछ अलग-अलग तरीकों का पता चला, लेकिन उनमें से सभी एक ही चीज़ हैं।एसएसएल (https) पर सरल HttpWebRequest 404 को C#

एक वेब ब्राउज़र पर 'http' के साथ मेरे यूआरआई का परीक्षण, एक खाली एचटीएमएल (खाली शरीर के साथ) वापस करना चाहिए। यह ब्राउज़र में और मेरे कोड में ठीक काम करता है।

मैं आगे http://www.google.com की कोशिश की और मुझे Google ... (जैसा अपेक्षित था) मिला। समस्या उत्पन्न होती है जब मैं यूआरआई को http से https में बदलता हूं। वेब ब्राउज़र पर 'https' के साथ मेरे यूआरआई का परीक्षण, उसी रिक्त एचटीएमएल (यह अपेक्षित है) देता है। लेकिन जब मैं कोड में एक ही यूआरआई कोशिश करता हूं, तो मुझे 404 नहीं मिला।

try 
{ 
    string lcUrl = "http://servicios.mensario.com/enviomasivo/apip/"; 
    //string lcUrl = "https://servicios.mensario.com/enviomasivo/apip/"; 

    // *** Establish the request 
    HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); 

    // *** Set properties 
    loHttp.Timeout = 10000;  // 10 secs 
    loHttp.Method = "POST"; // I added this for testing, but using GET or commenting this out doesn't change anything. 

    // Retrieve request info headers ******** HERE I GET THE EXCEPTION ********** 
    HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse(); 

    // All this code only works when lcUrl is NOT https. 
    Encoding enc = Encoding.GetEncoding(1252); // Windows default Code Page 

    StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc); 

    string lcHtml = loResponseStream.ReadToEnd(); 

    loWebResponse.Close(); 
    loResponseStream.Close(); 
} 
catch (WebException ex) 
{ 
    if (ex.Status == WebExceptionStatus.ProtocolError) 
    { 
    HttpWebResponse response = ex.Response as HttpWebResponse; 
    if (response != null) 
    { 
     // Process response 
     Console.WriteLine(ex.ToString()); 
    } 
    } 
} 
Console.Read(); 
return; 

अपवाद नहीं है:

System.Net.WebException: The remote server returned an error: (404) Not Found. at System.Net.HttpWebRequest.GetResponse()

टिप्पणी: http यूआरएल यहाँ दिखाया गया है

यहाँ सरल कोड (और URI) (दूसरा एक टिप्पणी हटाएं कोशिश करने के लिए https) है असली मुझे उपयोग करना है, यह मेरे साथ नहीं बल्कि किसी अन्य कंपनी के लिए है।

तो प्रतिक्रिया ठीक थे, यह क्या lcHtml शामिल करना चाहिए है:

<html> 
<head> 
<title></title> 
</head> 

<body> 
</body> 
</html> 

के बाद से मैं googled और एक इस सवाल का पोस्ट करने से पहले बहुत कुछ StackOverflowed, मैं कुछ विचार में पता चला। एक "अनदेखा प्रमाणपत्र" कोड जोड़ना है:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) 
    { 
     return true; // **** Always accept 
    }; 

ऐसा कुछ भी नहीं दिखता है।

अन्य उपयोगकर्ता ने कहा कि एसएसएल प्रोटोकॉल प्रकार गलत हो सकता है ... इसलिए मैं कोई लाभ नहीं हुआ इन दो के साथ करने की कोशिश की:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

कोई भी विचार?

अद्यतन मैं वापस गया और एक सरल कंसोल ऐप बनाया।

WebRequest req = WebRequest.Create("http://servicios.mensario.com/enviomasivo/apip/"); 
WebResponse resp = req.GetResponse(); 

काम करता है यही कारण है कि: केवल कोड यह है। कोई ग़लती नहीं।

हालांकि, अगर मैं https का URI बदलने के लिए:

WebRequest req = WebRequest.Create("https://servicios.mensario.com/enviomasivo/apip/"); 
WebResponse resp = req.GetResponse(); 

मैं (आगे जाना है और यह कोशिश) कोई त्रुटि मिलती है।

हालांकिthis PHP कोड काम करता प्रतीत होता है।केवल प्रासंगिक कोड की पंक्ति है कि मैं अलग देखना है:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 

टिप्पणी, स्पेनिश में कहते हैं: "इस के साथ हम एसएसएल प्रमाणपत्र अनदेखा कर सकते हैं"।

मुझे लगता है कि यह कुंजी है। लेकिन

System.Net.ServicePointManager.ServerCertificateValidationCallback… 

... सामान, ऐसा ही प्रतीत नहीं होता है।

अग्रिम धन्यवाद।

+4

+1 "StackOverflowed" शब्द का उपयोग क्रिया के रूप में करने के लिए। – Cerebrus

+0

हेहेहे, धन्यवाद। ;) –

उत्तर

10

फिडलर और फ़ायरफ़ॉक्स का उपयोग करके कुछ प्रयोग करने के बाद, ऐसा लगता है कि आपका यूआरएल समस्या है।

https://servicios.mensario.com/enviomasivo/apip/

और इस नहीं करता है:: मेरे लिए, यह एक 404 देता है

https://servicios.mensario.com/enviomasivo/apip

ध्यान दें, न खत्म होने वाली स्लेश। साथ ही, आपके द्वारा पोस्ट किए गए PHP नमूने में अंतिम स्लैश नहीं है।

+0

हे, तुम्हें पता है, मैं * सटीक * यूआरएल छह बार के लिए (सेवा की) प्रोग्रामर पूछा है। उन्होंने मुझे स्लेश संस्करण के साथ एक ईमेल भेजा। मैंने गैर-स्लेश के साथ एक बार कोशिश की लेकिन मेरा कोड गलत था और "सुरक्षित पक्ष में रहने के लिए" मैंने प्रोग्रामर द्वारा सुझाए गए स्लैश को छोड़ दिया। लेकिन ... इसे बदलने के बाद, चीजें काम करना शुरू कर दिया! तुम मेरे नायक हो! बहुत बहुत धन्यवाद!!! –

0

आप चाल यहाँ वर्णित की कोशिश कर सकते: http://oregonstate.edu/~reeset/blog/archives/166

+0

धन्यवाद। मैंने अभी कोशिश की है लेकिन यह कुछ भी नहीं बदला है। यह वास्तव में दिलचस्प है कि वहां वर्णित विधि, अब इसे अप्रचलित के रूप में चिह्नित किया गया है और कॉलबैक जाने का तरीका है। यह: ServicePointManager.ServerCertificateValidationCallback + = नया रिमोट प्रमाणपत्र प्रमाणीकरण कॉलबैक (मान्य सर्वर सर्वर); –

+0

हम्म बहुत बुरा यह कुछ भी नहीं किया। क्या आप वेब सर्वर लॉगफाइल में 404 भी देखते हैं? – thijs

+0

मेरे पास वेब सर्वर लॉगफाइल तक पहुंच नहीं है :(यह मेरा वेबसर्वर नहीं है। मुझे लगता है कि मुझे यहां कुछ गड़बड़ करनी होगी ... अजीब नहीं हो सकता है। –

0

यह नहीं लगती है यह कोड के साथ एक समस्या है, के बाद से प्रदत्त URL वैसे भी मान्य SSL प्रमाणपत्र के लिए लगता है।

के साथ "https://www.google.com" काम करता है अपने दो लाइन का टुकड़ा कोशिश कर रहा है, इसलिए मैं जब servicios.mensario.com/enviomasivo/apip पर HTTP और HTTPS का उपयोग कर HTTP अनुरोध क्षेत्रों की तुलना करने के फ़िडलर की तरह एक वेब डिबगिंग प्रॉक्सी स्थापित करने का सुझाव। क्या आप उस साइट पर एक रिवर्स प्रॉक्सी का उपयोग कर रहे हैं?

+0

हाय मैक्सम, मैं किसी प्रकार का प्रॉक्सी नहीं चला रहा क्या आपने https://servicios.mensario.com/enviomasivo/apip/ के खिलाफ दो-पंक्ति स्निपेट चलाने का प्रयास किया है? क्या आपको 404 मिलते हैं? धन्यवाद। –

+0

हाय, मैंने फिडलर स्थापित किया है। "दो- लाइन "बनाम एचटीटीपीएस (मुझे अपवाद मिलता है), परिणाम ठीक लगता है, हालांकि फिडलर का कहना है कि यह एन्क्रिप्ट किया गया है। अगर मैं डिक्रिप्ट करता हूं (फिडलर में) परिणाम ठीक लगता है: HTTP/1.1 404/enviomasivo/apip/ सेट -कुकी: JSESSIONID = 13B63930D2DBA0520FB602D8006B6C44; पथ =/enviomasivo; सुरक्षित सामग्री-प्रकार: टेक्स्ट/एचटीएमएल; वर्णसेट = आईएसओ -885 9 -1 दिनांक: मंगलवार, 21 अप्रैल 200 9 15:54:00 जीएमटी सर्वर: अपाचे-कोयोट/1।1 सामग्री-लंबाई: 61

संबंधित मुद्दे