لماذا أحصل على protocolviolationException عند محاولة استخدام httpwebrequest؟

StackOverflow https://stackoverflow.com/questions/2480258

  •  21-09-2019
  •  | 
  •  

سؤال

ليست لدي ادنى فكرة. أحاول الحصول على XML من خدمة REST على تطبيق أقوم بإنشاء Windows Phone. أحصل دائمًا على استثناء في السطر التالي:

HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;

لدي الإعداد التالي (تجاهل عنوان URL السيئ ، إنه مجرد مثال ..)

HttpWebRequest request = WebRequest.Create("https://domain.chargify.com/customers.xml") as HttpWebRequest;
NetworkCredential credentials = new NetworkCredential("appkeyhere", "password");
request.Credentials = credentials;
request.Method = "GET";
request.ContentType = "text/xml";
request.BeginGetResponse(new AsyncCallback(SomeCallback), request);
...
private void SomeCallback(IAsyncResult ar) {
    HttpWebRequest request = ar.AsyncState as HttpWebRequest;
    HttpWebResponse response = request.EndGetResponse(ar) as HttpWebResponse;
    StreamReader reader = new StreamReader(response.GetResponseStream());
    XElement xmlResult = XElement.Parse(reader.ReadToEnd());
    ...
}

الاستثناء كما يلي:

System.Net.ProtocolViolationException was unhandled
Message=ProtocolViolationException
  StackTrace:
       at System.Net.Browser.ClientHttpWebRequest.PrepareAndSendRequest(String method, Uri requestUri, Stream requestBodyStream, WebHeaderCollection headerCollection, CookieContainer cookieContainer)
       at System.Net.Browser.ClientHttpWebRequest.BeginGetResponseImplementation()
       at System.Net.Browser.ClientHttpWebRequest.InternalBeginGetResponse(AsyncCallback callback, Object state)
       at System.Net.Browser.AsyncHelper.BeginOnUI(BeginMethod beginMethod, AsyncCallback callback, Object state)
       at System.Net.Browser.ClientHttpWebRequest.BeginGetResponse(AsyncCallback callback, Object state)
       at ChargifyWPA.MainPage.button1_Click(Object sender, RoutedEventArgs e)
       at System.Windows.Controls.Primitives.ButtonBase.OnClick()
       at System.Windows.Controls.Button.OnClick()
       at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       at System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
       at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

هل لدي احد اى افكار؟ إنه https ، وليس http .. هل هذا يسبب القضية؟ شكرًا.

هل كانت مفيدة؟

المحلول

رهاني هذه المشكلة لأنك تقوم بتعيين رأس "ContentType" ، ولكن لا توفر المحتوى في طلبك. لاحظ أن استثناء البروتوكول يتم طرحه أثناء محاولة إنشاء الطلب.

ربما تعني تعيين رأس "قبول" على "Text/XML" بدلاً من رأس نوع المحتوى.

نصائح أخرى

هذه ليست مشكلتك ، لكنها قد تساعد شخصًا آخر. واجهت هذا لأنني كنت أتصل بـ BegingetRequestStream () بناءً على طلب الحصول على. بالطبع ، هذا ليس ضروريًا ، وكان ينبغي عليّ الاتصال بـ PegingetResponse (). خطأ سخيف ، لكنني كنت قد اكتشفت ذلك بشكل أسرع إذا كانت رسالة الخطأ أكثر فائدة.

رأس "نوع المحتوى" مع "GET" يسبب الاستثناء إذا كان موجودًا عند الطلب في Azure Table REST API ، فمن المطلوب تشفير contentType إلى رأس Auth - استخدم سلسلة فارغة لـ Get's Header "ContentType"

يبدو أن السبب الأكثر شيوعًا لهذا الخطأ على سطح المكتب هذه الأيام هو خادم ويب يتطلب مصادقة SSL بدلاً من مصادقة TLS. انظر كل التعليقات على تشرح هذه المقالة خيارات استكشاف الأخطاء وإصلاحها لمختلف أخطاء .NET 2 HTTP. يبدو أن مشروع chargify.net المرخص له معهد ماساتشوستس للتكنولوجيا على codeplex بالفعل باستخدام هذا العمل ("SecurityProtocoltype.ssl3").

خيارات أخرى للمحاولة من مقال آخر حوالي عام 2008 يعودون إلى HTTP/1.0 أو تعطيل الحفاظ على الحافة.

تأكد من المحاولة هذا الجواب, ، إزالة تهيئة contentType.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top