سؤال

مرحبًا، أواجه مشكلات أثناء محاولة نشر طلب WebRequest ضمن Https.

تلقيت الأخطاء التالية

1.-تم إغلاق الاتصال الأساسي:لا يمكن الاتصال باالخادم.

2.-عملية TimeOut

3-تم إغلاق الاتصال الأساسي:تعذر إنشاء قناة آمنة لـ SSL/TLS.

لقد حاولت مع حوالي 3 أو 4 وكلاء مختلفين لشركتي والشركة العميلة، وحتى عندما أكون مباشرة مع مزود خدمة الإنترنت دون قيود، أحصل على الأخطاء المذكورة أعلاه عند تنفيذ الطريقة التالية

WebRequest.GetRequestStream() 

يحدث هذا خلف وكيل أم لا، ولا يمكن نشر الطلب بنجاح إلا من جهاز كمبيوتر واحد خلف وكيل.الوكيل ليس لديه شهادة عميل مثبتة.

هذا تحت .NET Framework 1.1 والطلب يحتوي بالفعل على بيانات اعتماد الشبكة.

ماذا يمكن أن يكون؟

تحديث

الاستثناء الداخلي الخطأ الثالث هو ما يلي:اكتملت الوظيفة بنجاح، ولكن يجب استدعاؤها مرة أخرى لإكمال السياق

وفقًا لموقع iisper.h توثيق هذا الخطأ ينتمي إلى

//
// MessageId: SEC_I_CONTINUE_NEEDED
//
// MessageText:
//
//  The function completed successfully, but must be called
//  again to complete the context
//
#define SEC_I_CONTINUE_NEEDED            ((HRESULT)0x00090312L)

على MSDN هذا يشير إلى

sec_i_continue_needed يجب على العميل إرسال رمز الإخراج إلى الخادم وانتظر رمز الإرجاع.يتم بعد ذلك تمرير الرمز المميز الذي تم إرجاعه في استدعاء آخر لـInitializeSecurityContext (Schannel).يمكن أن يكون رمز الإخراج فارغًا.

هل هذا يعني أن جهاز الكمبيوتر يفتقر إلى شهادة العميل؟

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

المحلول

وهناك عدد من الأمور التي يمكن أن تعقيد الأمور، بقدر ما التناقضات مع موتس SSL، وما إلى ذلك ولكن أولا، يجب عليك القيام ببعض التصحيح الأساسي لاستبعاد الأشياء واضحة:

- هل جربت إرسال طلب ويب بسيطة إلى خوادم أخرى؟ حاول كل من (غير المضمونة) HTTP و (المضمون) الشبكي

- هل حاول الاتصال من كمبيوتر آخر، أو من شبكة أخرى؟ لقد ذكرت أن العميل هو خلف وكيل. محاولة كمبيوتر ث / س وكيل أول، إلى استبعاد ذلك.

- هل جعل WebRequests متعددة ضمن الدورة؟ هناك الحد الثابت على عدد من طلبات مفتوحة، لذلك تأكد من أنك إغلاقها بعد الحصول على المستخدم WebResponse. ربما جعل برنامج اختبار مع طلب واحد فقط.

إذا لا ضيق عليه، فإن ذلك ربما شيء أكثر تعقيدا، مع من الملقم أو الوكيل. يمكنك تتبع حزم الشبكة الصادرة مع برنامج مثل netshark في محاولة لتعقب حيث أن يعلقوا الأشياء.

نصائح أخرى

هل يمكن أن تجعل أي أثر للحركة HTTP باستخدام عازف الكمان أو أداة حزمة شبكة استنشاق مثل <الصورة> أثيري Whireshark على الجهاز حيث يتم العمل عليه، وعلى واحد من الآخر الآلات، ومقارنة النتائج. هذا هو إلى حد ما على مستوى منخفض، ولكن قد رمي بعض الضوء على هذه القضية.

  • إذا كان بإمكانك الاتصال عبر telnet من أجهزة مختلفة إلى 443، فهذا ليس الأولين، لأن هذا يعني أن جهاز العميل يتلقى الطلبات على هذا المنفذ.

على النوافذ التي من شأنها أن تكون

telnet <domainname> 443

وإذا تم توصيله، فستصبح الشاشة فارغة (اضغط على "رجوع" عدة مرات للخروج)

  • قد يهتم الوكلاء أو لا يهتمون فعليًا بطلبك إذا كان ضمن HTTPS لأنهم لا يستطيعون قراءته.

  • هل تم تثبيت شهادة العميل وسلسلة الشهادات على الأجهزة الأخرى؟

واسم شهادة SSL ربما لا تتطابق. هذا هو الحال غالبا مع شهادات selfsigned.

والحل هو لكتابة روتين المصادقة الخاصة بك حيث يمكنك إما العودة دائما صحيحا أو القيام المصادقة اللازمة للتأكد من أن الشهادة صالحة.

// .NET 2.0+
...
ServicePointManager.ServerCertificateValidationCallback += MyValidationCallback
...
public bool MyValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors err)
{
  return true;
}

// .NET 1.1
public class MyCertificatePolicy : ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
  {
    return true;
  }
}
...
ServicePointManager.CertificatePolicy = new MyCertificatePolicy();
...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top