سؤال

لا يمكنني أن أحصل على رأسي حول هذا. أنا أستخدم httpwebrequest لمحاولة إرسال بعض البيانات إلى موقع آخر. أحاول معرفة أفضل طريقة لتكوين جدران الحماية الخاصة بنا ، لكنني في حيرة. من خلال مشاهدة تتبع Netmon ، يبدو الأمر كما لو أنه يتجاهل ما أقوله ؛ رؤوس HTTP التي أراها تخرج من الطلب (وليس طلب المتصفح إلى خادم ، ولكن طلب خادم خادم خادم إلى خادم) لا يضيف.

Http: Request, CONNECT some.random.url:443
Command: CONNECT
URI: some.random.url:443
    Location: some.random.url:443
ProtocolVersion: HTTP/1.1
Host: some.random.url
ProxyConnection: Keep-Alive
HeaderEnd: CRLF

يبدو أن TCP DSTPORT يبدأ دائمًا بـ HTTP (80). لا يبدو لي أن أحصل عليه للتعامل مع 443 في البداية ، بغض النظر عن ماذا ؛ هل يبدأ SSL مع منفذ 80 قبل أن يبدأ الإرسال "الحقيقي"؟ للتمهيد ، يبدو أن هذا الطلب يتجاهل أي إعدادات httpwebrequest أحاول تعيينها قبل بدء الطلب: حتى لو قمت بتعيين HTTP 1.0 ، أو حافظ على خطأ ، فإنه لا يزال يبدأ بالرؤوس أعلاه.

ماذا يفعل؟ أود أن أعرف كيف أتركها ، لكنني لست متأكدًا من سبب عرض هذا السلوك؟

رمز أدناه ، إذا كان يساعد.

Uri newUri = new Uri("https://some.random.url:443/random");
System.Net.HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(newUri);
wr.Method = "POST";
wr.ContentType = "application/x-www-form-urlencoded";
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] requestBytes = encoding.GetBytes("test");
wr.ContentLength = requestBytes.Length;
System.IO.Stream stream = wr.GetRequestStream(); //FAILS HERE, ServerProtocolViolation

لقد بحثت على Google وغيرها من مشاكل SSL/HTTPWebRequest ، لكن لا يمكنني التوصل إلى رصاصة فضية.

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

المحلول

يبدو أن مشكلتك هي خادم الوكيل بين خادم ASP.NET والخادم البعيد. يمكنك محاولة عدم استخدام خادم الوكيل (wr.proxy = null) ، ولكن قد يكون ذلك مطلوبًا لإعداد الشبكة.

أوصي بالتحدث إلى من هو المسؤول عن الشبكة التي يكون فيها الخادم الخاص بك ومعرفة ما إذا كان الوكيل يدعم SSL تمريرة (عبر الأمر Connect .NET يرسل نيابة عنك).

نصائح أخرى

لقد فعلت HttpWebRequest المكالمات عبر SSL ولم يواجه هذه المشكلة أبدًا. الشيء الوحيد الذي يمكنني رؤيته أنك لا أفعله من قبل هو تضمين رقم المنفذ (443) في عنوان URL.

.NET يجب التعامل مع إنشاء اتصال SSL دون أن يتم إخباره بمنفذ استخدامه عند استخدامك https بروتوكول. إذا لم تقم بذلك بالفعل ، فحاول بدون رقم المنفذ. إذا كان لديك ، فأنا خارج الأفكار ؛)

جرب هذا واسمحوا لي أن أعرف كيف تجده!

htw.credentials = NetworkCredentials (اسم المستخدم ، كلمة المرور)

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