سؤال

هذه القطعة لا تعمل؛ يتم تسجيل الدخول إلى موقع الويب الذي يستخدم بروتوكول HTTPS. كيفية حل هذه المشكلة؟ توقف الكود في GetRequestStream() في أي وقت في أي مكان يقول أن استثناء انتهاك البروتوكول غير معالج ..

string username = "user";
string password = "pass";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://moje.azet.sk/prihlasenie.phtml?KDE=www.azet.sk%2Findex.phtml%3F");
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)";

Console.WriteLine(request.GetRequestStream());

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
    writer.Write("nick=" + username + "&password=" + password);
}

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//Retrieve your cookie that id's your session
//response.Cookies

using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    Console.WriteLine(reader.ReadToEnd());
}
هل كانت مفيدة؟

المحلول

تعيين طريقة طلب للنشر، قبل الاتصال getrequeststream

مثل

request.Method = "POST";

using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
{
    writer.Write("nick=" + username + "&password=" + password);
}

نصائح أخرى

تخميني هو أن المشكلة التي تواجهها هي الحقيقة (مثل الآخرين قد نصحوا) أنك تقوم بطلب الحصول عليها بدلا من طلب المشاركة. بالإضافة إلى ذلك، لاحظت أن الاسم الفعلي لحقل كلمة المرور في تلك الصفحة هو "Heslo" وليس "كلمة المرور". لن يتسبب هذا الخطأ المطبعي في عدم إرجاع خادم الويب استجابة، لكنه سيؤدي إلى أن المشكلات الأخرى لأن الخادم يبحث عن اسم المتغير المحدد المراد نشرها باستخدام قيمة كلمة المرور.

قد ترغب أيضا في معرفة الطول الإجمالي لما تنشره، مسبقا، وقم بتعيين ذلك كطول Contentlylow للطلب. يرى MSDN.:

يتم إلقاء protocolviolviolationException في عدة حالات عندما تتعارض الخصائص التي تم تعيينها على فئة HttpWebRequest. يحدث هذا الاستثناء إذا قام التطبيق بتعيين خاصية ContentLength والخاصية SendChunked إلى TRUE، ثم يرسل طلب الحصول على HTTP. يحدث هذا الاستثناء إذا حاول التطبيق إرسال قطع إلى خادم يدعم فقط بروتوكول HTTP 1.0، حيث لا يتم دعم هذا. يحدث هذا الاستثناء إذا حاول التطبيق إرسال البيانات دون تعيين خاصية ContentLength أو SendChunked هو خطأ عند تعطيل التخزين المؤقت وعلى اتصال Keepalive (خاصية Keepalive صحيحة).

هنا هو ما يعمل بالنسبة لي:

    var request = WebRequest.Create(_url);
    request.PreAuthenticate = true;
    request.Credentials = new NetworkCredential(_userName, _password);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top