मैं विजुअल स्टूडियो 2017 में Windows Service पर काम कर रहा हूं। बाकी एपीआई कॉल में, कोड डीबग करते समय अपवाद प्राप्त करना। कभी-कभी अपवाद मिलने के बाद काम करने वाले पहले 2 3 कॉल।

System.Net.WebException: 'दूरस्थ सर्वर ने एक त्रुटि दी: (503) सर्वर अनुपलब्ध।'

दूरस्थ सर्वर ने एक त्रुटि दी: (429)

दूरस्थ सर्वर से कनेक्ट करने में असमर्थ

पोस्टमैन से उसी एपीआई को कॉल करते समय, सफलतापूर्वक प्रतिक्रिया प्राप्त करना।

यह मेरा कोड है

private void timer1_Tick(object sender, ElapsedEventArgs e)
{
    WriteToFile("timer1_Tick method called..");
try
{
    string jsonString = "";
    string jsonstring2 = "";
    string prodfetchurl = HOST;
    var req = WebRequest.Create(prodfetchurl) as HttpWebRequest;
    req.Method = "GET";
    InitializeRequest(req);
    req.Accept = MIME_TYPE;
    //System.Threading.Thread.Sleep(5000);
    var response = (HttpWebResponse)req.GetResponse();
    WriteToFile("First service called...");
    if (response.StatusCode == HttpStatusCode.OK)
    {
        Stream responseStream = response.GetResponseStream();
        StreamReader responseReader = new StreamReader(responseStream);
        jsonString = responseReader.ReadToEnd();
    }
    var deserialsseobj = JsonConvert.DeserializeObject<ProductList>(jsonString).Products.Where(i => i.Failed > 0).ToList();
    foreach (var a in deserialsseobj)
    {
        var pid = a.ID;
        string url = FailedDevicesUrl + pid.Value + "/failed";
        var req2 = WebRequest.Create(url) as HttpWebRequest;
        req2.Method = "GET";
        InitializeRequest(req2);

        req2.Timeout = 300000;
        req2.Accept = MIME_TYPE;
        var response1 = (HttpWebResponse)req2.GetResponse();
        Stream responsestream2 = response1.GetResponseStream();
        WriteToFile("Second service called...");
        if (response1.StatusCode == HttpStatusCode.OK)
        {
            StreamReader responsereader1 = new StreamReader(responsestream2);
            jsonstring2 = responsereader1.ReadToEnd();
        }

        var output = JsonConvert.DeserializeObject<List<FailedDeviceList>>(jsonstring2);  // Will get List of the Failed devices
        List<int> deviceids = new List<int>();
        Reprocessdata reproc = new Reprocessdata();
        Reprocessdata.DeviceId rprod = new Reprocessdata.DeviceId();

        reproc.ForceFlag = true;
        reproc.ProductID = pid.Value;
        foreach (var dd in output)
        {
            rprod.ID = dd.DeviceId;
            reproc.DeviceIds.Add(rprod);
        }

        // Reprocess the Product in Devices
        var req3 = WebRequest.Create(ReprocessUrl) as HttpWebRequest;
        req3.Method = "POST";
        InitializeRequest(req3);
        req3.Accept = MIME_TYPE;
        req3.Timeout = 300000;
        req3.ContentType = "application/json";
        using (StreamWriter writer = new StreamWriter(req3.GetRequestStream()))
        {
            string json = new JavaScriptSerializer().Serialize(reproc);

            writer.Write(json);
            writer.Close();
        }
        System.Threading.Thread.Sleep(5000);
        var response5 = (HttpWebResponse)req3.GetResponse();
        WriteToFile("Third service called...");
        if (response5.StatusCode == HttpStatusCode.OK)
        {
            string result;
            using (StreamReader rdr = new StreamReader(response5.GetResponseStream()))
            {
                result = rdr.ReadToEnd();
            }
        }
    }
    response.Close();
}
catch (Exception ex)
{
    WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace);
}
}

उपरोक्त कोड में उपयोग की जाने वाली विधियाँ

protected override void OnStart(string[] args)
{
    base.OnStart(args);
    timer1 = new System.Timers.Timer();
    timer1.Interval = 60000; //every 1 min
    timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Tick);
    timer1.Enabled = true;
    WriteToFile("Service has started..");
}

public void InitializeRequest(HttpWebRequest request)
{
    request.Headers.Add("aw-tenant-code", API_TENANT_CODE);
    request.Credentials = new NetworkCredential(USER_NAME, PASSWORD);
    request.KeepAlive = false;
    request.AddRange(1024);
}

जब मैंने सर्विस प्रोवाइड से संपर्क किया तो उन्होंने कहा कि वहां से सब कुछ ठीक है। क्या यह मेरा कोड छोटी गाड़ी है या विंडोज़ सेवा विश्वसनीय नहीं है? मैं इस समस्या को कैसे हल कर सकता हूं?

नोट: सभी APIS विजुअल स्टूडियो कोड का उपयोग करके कोणीय एप्लिकेशन से ठीक काम कर रहे हैं। इसका मतलब है कि मेरा कोड काम नहीं कर रहा है।

संपादित करें1: नीचे दी गई तीन सेवाएं जिनका उपयोग मैं इस दस्तावेज़ से कर रहा हूं वीएमवेयर की।

private const string HOST = "https:host/api/mdm/products/search?";
private const string FailedDevicesUrl = "https:host/api/mdm/products/";
private const string ReprocessUrl = "https:host/api/mdm/products/reprocessProduct";
3
R15 4 मार्च 2020, 09:45
अधिक विश्वसनीय सेवा को कॉल करें?
 – 
Alexei Levenkov
4 मार्च 2020, 09:48
क्या आप कह रहे हैं, मुझे दूसरी सेवाओं का उपयोग करने का प्रयास करना चाहिए? मैं 3 सेवाओं का उपयोग कर रहा हूं, वे विफल हो रहे हैं यदि पहली सफलता दूसरी विफल हो जाएगी यदि पहली और दूसरी सफलता तीसरी विफल हो जाएगी। इस तरह यह चल रहा है। शायद ही कभी सभी 3 निष्पादित हो रहे हों।
 – 
R15
4 मार्च 2020, 09:51
हां, वास्तव में यदि आप 503 प्रतिक्रियाएं प्राप्त नहीं करना चाहते हैं तो ऐसी सेवा चुनें जिसकी बेहतर गारंटी हो। आम तौर पर मुफ्त सेवाएं (या एक बार जब टीओयू इस तरह के उपयोग को पूरी तरह से प्रतिबंधित कर देता है) थ्रॉटलिंग करने का प्रयास करेगा या केवल 503 में ओवरलोड हो जाएगा। अपनी अच्छी तरह से वित्त पोषित सेवा या किसी और को भुगतान की गई सेवा को कॉल करना 503 से बचने का समाधान है ... अगर किसी कारण से आप अभी भी उस सेवा को कॉल करना चाहते हैं जो वर्तमान में 503 लौटाती है आप सेवा के मालिकों के साथ चैट करना चाह सकते हैं और इसे बेहतर बनाने के लिए चिप कर सकते हैं ...
 – 
Alexei Levenkov
4 मार्च 2020, 10:01
इन सेवाओं का भुगतान VMWare सेवाओं के लिए किया जाता है जिनका मैं उपयोग कर रहा हूं। पोस्टमैन का उपयोग करते समय मैं उसी सेवा के लिए प्रतिक्रिया प्राप्त करने में सक्षम हूं। लेकिन जब मेरे कोड की बात आती है जो काम नहीं कर रहा है। तो मैंने सोचा कि यह सोचकर कि मेरे कोड में बग है, यहां एक प्रश्न रखा जाए?
 – 
R15
4 मार्च 2020, 10:07
प्रश्न कहता है कि कोड सफलतापूर्वक काम करता है - इसलिए आपके क्लाइंट कोड में करने के लिए बहुत कुछ नहीं है - और इसके बजाय या तो सर्वर पर लोड कम करें या सर्वर को अधिक प्रदर्शन करने के लिए कहें या f आप थ्रॉटल सीमा को मार रहे हैं और वास्तविक नहीं 503 मालिकों से आपको अनुमति देने के लिए कहें अधिक अनुरोध/अधिक बार-बार अनुरोध करने के लिए। (मैंने "10 में से 8 मामलों में 503" पढ़ा है क्योंकि 2 अनुरोध सफलतापूर्वक संभाले गए हैं, जिसका अर्थ है कि कोड सही ढंग से अनुरोधों का निर्माण करता है, यदि ऐसा नहीं है - संपादित करें यह समझाते हुए प्रश्न कि क्या आपको शेष मामलों में 40x या अन्य 50x कोड मिल रहे हैं - जो ठीक करने योग्य ग्राहक पक्ष हो सकता है)
 – 
Alexei Levenkov
4 मार्च 2020, 10:16

2 जवाब

प्रतिक्रिया http कोड 429 इंगित करता है कि आप लक्ष्य वेब सेवा पर बहुत अधिक अनुरोध भेज रहे हैं।

इसका मतलब है कि जिस सेवा के लिए आप अनुरोध भेजने का प्रयास कर रहे हैं उसकी नीतियां अनुरोध-प्रति-समय सीमा के आधार पर कुछ अनुरोधों को अवरुद्ध करती हैं।

मैं यह भी मानता हूं कि विशिष्ट मामलों में 403 कोड फेंकने के लिए बाहरी सेवा को मैन्युअल रूप से कॉन्फ़िगर किया जा सकता है, जिनके बारे में आप नहीं जानते हैं। अगर ऐसा है, तो इस जानकारी को बाहरी सेवा दस्तावेज़ीकरण में समझाया जा सकता है... या नहीं :)

आप इससे क्या कर सकते हैं?

सीमाओं में फ़िट करें
आप विस्तृत शोध कर सकते हैं कि लक्ष्य webservice की क्या सीमाएं हैं और इस सीमाओं में फिट होने के लिए अपना कोड सेट करें। उदाहरण के लिए यदि सेवा में प्रति 10 मिनट में केवल एक अनुरोध प्राप्त करने की सीमा है - तो आपको प्रत्येक 10 या अधिक मिनट में एक अनुरोध भेजने के लिए अपना टाइमर सेट करना होगा। यदि दस्तावेज़ीकरण ऐसी जानकारी प्रदान नहीं करता है - तो आप बाहरी सेवा प्रतिक्रियाओं के साथ कुछ पैटर्न ढूंढकर इसका मैन्युअल रूप से परीक्षण कर सकते हैं।

प्रॉक्सी का उपयोग करें
अनुरोध भेजने वालों के बारे में जानकारी के आधार पर हर सीमा नीति। आमतौर पर इस जानकारी में केवल प्रेषक का आईपी पता होता है। इसका मतलब है कि यदि आप दो अलग-अलग आईपी पते से 2 अनुरोध भेजते हैं - सीमा नीति यह मान लेगी कि 2 अलग-अलग कंप्यूटर इन अनुरोधों को भेज रहे हैं। तो आप कुछ प्रॉक्सी आईपी पते ढूंढ/खरीद/किराए पर ले सकते हैं और लक्षित वेब सर्वर पर वहां से अनुरोध भेज सकते हैं।

WebRequest का उपयोग करके C# में प्रॉक्सी के माध्यम से कैसे कनेक्ट करें आप इस उत्तर में देख सकते हैं।

बाहरी सेवा प्रदाता के साथ बातचीत करें
यदि आपके पास बाहरी सेवा डेवलपर्स या सहायता केंद्र के साथ संवाद करने की संभावना है, तो आप उनसे अपने आईपी पते के लिए सीमाएं कम करने के लिए कह सकते हैं (यदि यह स्थिर है) या आपके लिए सीमा नीति से बचने के लिए कुछ तंत्र प्रदान करें। यदि किसी कारण से वे यह अवसर प्रदान नहीं कर सकते हैं, तो कम से कम आप सीमाओं के बारे में विस्तृत जानकारी पूछ सकते हैं।

दोहराव तंत्र
कभी-कभी 503 त्रुटि कोड जो आपको प्राप्त हुआ बाहरी अपवाद है, सेवा अनुपलब्ध होने के कारण हो सकता है। इसका मतलब है कि सर्वर रखरखाव के अधीन हो सकता है या अस्थायी रूप से अतिभारित हो सकता है। तो आप सर्वर को लगातार भेजने के अनुरोध करने के लिए पुनरावृत्ति तंत्र लिख सकते हैं जब तक कि यह पहुंच योग्य न हो।

पोली लाइब्रेरी आपको दोहराव तंत्र बनाने में मदद कर सकती है

4
picolino 19 मार्च 2020, 19:34
"403 कोड फेंकने के लिए मैन्युअल रूप से कॉन्फ़िगर किया जा सकता है" - शायद आपका मतलब 503 है? :)
 – 
janw
19 मार्च 2020, 12:15
1
मेरा मतलब है कि हर संभव http प्रतिक्रिया कोड जिसे सर्वर द्वारा मैन्युअल रूप से वापस किया जा सकता है :)
 – 
picolino
19 मार्च 2020, 12:21
- जब मैं 10 मिनट का ब्रेक वापस लौटाता हूं और डिबगिंग शुरू करता हूं तब भी 429 (यदि मैंने इसे 429 प्राप्त करना छोड़ दिया है)। प्रत्येक कॉल से पहले मुझे Thread.Sleep(100000); अभी भी एक ही समस्या हो रही है, केवल पहले 1 या 2 कॉल काम कर रहे हैं (यदि मैं f5 दबाता हूं तो f5 सब कुछ बीजी में जा रहा है)। धन्यवाद।
 – 
R15
19 मार्च 2020, 16:58
क्या आपने एपीआई प्रदाता के दस्तावेज़ों की जांच की है, प्रति समय अनुरोध के लिए सीमा क्या है?
 – 
weichch
19 मार्च 2020, 17:09
आप किस बाहरी सेवा एपीआई का उपयोग करते हैं? क्या यह खुला है? हो सकता है कि हम इसकी डॉक्स जांच में आपकी मदद कर सकें? यदि आप अनुरोधों के बीच 10 मिनट का ब्रेक लेते हैं तो यह त्रुटि वास्तव में अजीब है।
 – 
picolino
19 मार्च 2020, 17:18

उस 503 की आंतरिक त्रुटि है:

दूरस्थ सर्वर ने एक त्रुटि दी: (429)

HTTP 429 बहुत अधिक अनुरोधों को इंगित करता है। हो सकता है कि आपका अपस्ट्रीम सर्वर भेजे गए सभी अनुरोधों को संसाधित न कर सके।

ऐसा तब हो सकता है जब आप किसी तृतीय पक्ष API को कॉल करने पर दर सीमित/थ्रॉटलिंग मान पर पहुंच गए हों।

अपडेट करें

एपीआई डॉक्स में पेज 28 के अनुसार, आप एक नया एपीआई बनाते समय थ्रॉटलिंग को कॉन्फ़िगर कर सकते हैं। जांचें कि क्या थ्रॉटलिंग बहुत छोटा है या शायद थ्रॉटलिंग को बंद कर दें और देखें कि क्या इससे त्रुटि ठीक हो सकती है?

enter image description here

4
weichch 25 मार्च 2020, 12:30
क्या कोई दस्तावेज है कि 503 आंतरिक त्रुटि के लिए 429 है।
 – 
R15
19 मार्च 2020, 17:02
503 और 429 व्यक्तिगत त्रुटियाँ हैं। 503 आमतौर पर प्रॉक्सी सर्वर से होते हैं, जैसे लोड बैलेंसर। यह कहा जा सकता है कि वास्तविक एपीआई सर्वर लोड बैलेंसर को 429 लौटा, फिर 503 के साथ लिपटा हुआ और क्लाइंट के पास वापस आ गया।
 – 
weichch
19 मार्च 2020, 17:05
आपके API के लिए थ्रॉटलिंग/कोटा कॉन्फ़िगरेशन हो सकता है, API दस्तावेज़ों का पृष्ठ 28 देखें। थ्रॉटलिंग मान बढ़ाने का प्रयास करें या थ्रॉटलिंग बंद करें और देखें कि क्या इससे अपवाद ठीक हो जाएगा।
 – 
weichch
20 मार्च 2020, 12:39
थ्रॉटलिंग कॉन्फ़िगरेशन क्या है, यह मेरी मदद कैसे करेगा।
 – 
R15
20 मार्च 2020, 13:32
थ्रॉटलिंग कॉन्फ़िगरेशन का उपयोग आमतौर पर यह निर्धारित करने के लिए किया जाता है कि सर्वर प्रति मिनट या प्रति दिन कितने एपीआई कॉल स्वीकार कर सकता है। पार होने पर, एपीआई को HTTP 429 लौटाना चाहिए परिदृश्य को इंगित करने वाले बहुत सारे अनुरोध। और HTTP 429 वह है जो आपको अपवाद संदेश के अनुसार मिला है।
 – 
weichch
20 मार्च 2020, 13:36