के तहत नहीं मिला है, मैं एक सुरक्षित कनेक्शन पर बैठे एक 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…
... सामान, ऐसा ही प्रतीत नहीं होता है।
अग्रिम धन्यवाद।
+1 "StackOverflowed" शब्द का उपयोग क्रिया के रूप में करने के लिए। – Cerebrus
हेहेहे, धन्यवाद। ;) –