سؤال

لقد استخدمت في الأصل WebRequest وWebResponse لإرسال رسائل نشر Http.لقد تلقيت دائمًا ردًا بـ "موافق".الرسالة التي أنشرها هي ملف XML موقّع بشهادة في ملف XML.

التكوين هو هذا:خدمة C# التي يتم إرسالها إلى موقع ويب https.موقع ويب HTTPS في مكان آخر لا أستطيع قوله.موقع HTTPS المحلي محليًا والذي يتلقى فقط الرسائل التي أنشرها محليًا ويكتب النتائج في ملف.فقط لمحاكاة ما يحصل عليه الموقع الآخر.

تم توقيع موقع الويب المحلي بشهادة موقعة ذاتيًا تنتهي صلاحيتها في عام 2048.

كان هذا الرمز يعمل بشكل جيد حتى هذا الأسبوع.لقد قمت دائمًا بالنشر وحصلت على موافقة.في كلا الموقعين.لكن الاختبار والتنفيذ الحقيقي للمشروع هذا الأسبوع يذهبان إلى كابوت.على كلا الموقعين.
على موقع الويب المحلي، كان يقول غير قادر على الاتصال بـ SSL.سبب هذه المشكلة هو الشهادة الموقعة ذاتيًا والتي لسبب ما يتجاوز فهمي فهي تسبب الجحيم.بفضل الأسئلة الواردة هنا، قمت للتو بالتحقق من صحة الشهادة لتكون صحيحة دائمًا والآن لم يعد هناك أي خطأ.

لإصلاح هذا فقط اكتب هذا:

ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();

في بداية طلبك.بحيث يتم تشغيله مرة واحدة فقط.

المشكلة المتبقية هي "أرجع الخادم البعيد خطأً:(503) الخادم غير متاح.".أقوم بإدخال عنوان URL في متصفحي وهو يعمل بشكل جيد بالنسبة لي.في الكود، لا يتلقى موقع الويب هذا أي شيء وعندما ينتقل إلى استجابة الويب، فإنه يعطيني الخطأ أعلاه

لقد قمت بإجراء تطبيق اختباري يرسل فقط "اختبار 1 2 3" ولكني أتلقى الخطأ باستمرار.لقد أرسلته أيضًا إلى موقع ويب harvard https ولم تكن هناك أخطاء.

private void btnSend_Click(object sender, EventArgs e)
    {
        try
        {
            WebRequest req = WebRequest.Create(cboUrl.Text);
            req.PreAuthenticate = true;
            req.UseDefaultCredentials = true;
            req.Method = "POST";
            req.ContentType = "text/xml";
            String msg = txtMsg.Text;

            using (Stream s = req.GetRequestStream())
            {
                try
                {
                    s.Write(
                        System.Text.ASCIIEncoding.ASCII.GetBytes(msg), 0, msg.Length);
                }
                finally
                {
                    s.Close();
                }
            }

            WebResponse resp = req.GetResponse();
            StreamReader str = new StreamReader(resp.GetResponseStream());

            txtRes.Text = str.ReadToEnd();
        }
        catch (WebException ex)
        {
            txtRes.Text = ex.Message;
        }
        catch (Exception ex)
        {
            txtRes.Text = ex.Message;
        }

    }

وهذا مثال آخر قمت بإنشائه مما وجدته على الإنترنت:

private void button1_Click(object sender, EventArgs e)
    {
        try
        {

            HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(cboUrl.Text);
            myReq.Headers.Clear();
            myReq.Method = "POST";
            myReq.KeepAlive = false;
            myReq.ProtocolVersion = HttpVersion.Version11;
            myReq.ContentType = "text/xml";
            myReq.Proxy = null;
            myReq.Credentials = null;
            myReq.ContentLength = txtMsg.Text.Length;
            using (StreamWriter sendingData = new StreamWriter(myReq.GetRequestStream()))
            {
                sendingData.Write(txtMsg.Text);
                sendingData.Flush();
                sendingData.Close();
            }

            HttpWebResponse myResponse = (HttpWebResponse) myReq.GetResponse();
            StreamReader responseStream = new StreamReader(myResponse.GetResponseStream());
            txtRes.Text = responseStream.ReadToEnd();

            responseStream.Close();
            myResponse.Close();

        }
        catch(WebException ex )
        {
            txtRes.Text = ex.Message;
        }
        catch (Exception ex)
        {
            txtRes.Text = ex.Message;
        }


    }

تحديث

كان الخطأ هو أن الشخص الذي كنت أتصل به باستخدام httpwebrequest، كان يحتاج إلى بعض رؤوس http التي لم أكن أقدمها.قبل ذلك، الشيء الوحيد الذي حدث هو أنني تلقيت ردًا بـ "موافق".لقد أصلحوا الكود الخاص بهم وأصلحت الكود الخاص بي والآن يعمل.

إذا حدث ذلك لشخص آخر، فتحقق كما هو موضح أدناه من إعدادات الوكيل وتحقق أيضًا مما إذا كان الجانب الآخر يقدم استثناءً أو لا يُرجع أي شيء على الإطلاق.

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

المحلول

إذا كنت كذلك لا تلقي خطأ 503 عند الانتقال إلى عنوان URL في متصفحك، ولكن يفعل استلامها عند طلب المورد عند استخدام HttpWebRequest، أول شيء أوصي به هو تحديد قيمة لـ وكيل المستخدم عند تقديم الطلب.

قد ترغب أيضًا في الاستخدام عازف الكمان2 أو أداة أخرى للحصول على فكرة أفضل عما يحدث أثناء مدة الطلب.من الصعب تقديم الإرشادات دون معرفة المزيد عن تفاصيل الخدمة التي ترسل الرسائل إليها.

نصائح أخرى

يبدو أن المشكلة هي أن هذا الموقع قد تغير.من قبل، إذا قمت بإرسال رسالة تحتوي على أي بريد غير هام، فسوف يُرجع الأمر "موافق" المعتاد.لقد قاموا بتغيير موقع الويب وهناك بعض رؤوس http المطلوبة.بالأمس كان لدي رؤوس http طوال اليوم وفي الليل عندما كان يعمل.في حالتي كان الأمر متوقعًا لرؤوس http ولم يحصل عليها وربما ينفجر شيء ما.

لقد اختبرته اليوم وأعطيت الرؤوس ولم أعطي رؤوس http وفي الحالة الأخيرة فعلت 503.

إذا وجدت المزيد من المعلومات سأحاول نشرها هنا.آمل أن يوفر هذا بعض الوقت وبعض الشعر لأشخاص آخرين :).

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

لمزيد من المعلومات، راجع: http://support.microsoft.com/kb/307220 و http://msdn.microsoft.com/en-us/library/kd3cf2ex.aspx .

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

request.Proxy = null;

request.Credentials = System.Net.CredentialCache.DefaultCredentials;

إذا قمت بإعادة تعيين IIS فتأكد من أنك لم تغير كلمة المرور الخاصة بك مؤخرًا.سخيفة ولكن يحدث ذلك.

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