मैं एक सर्वर पर नियमित पोस्ट भेज रहा हूं जो परिणामी डेटा को डेटाबेस में संग्रहीत कर रहा है। बहुत बार, सर्वर 400 त्रुटि लौटा रहा है, जिसका अर्थ यह प्रतीत होता है कि पोस्ट विकृत था। लेकिन मैं बता सकता हूं (इस तथ्य से कि सही डेटा डेटाबेस में संग्रहीत है) कि कभी-कभी सर्वर ने डेटा को स्वीकार कर लिया है। जेसन बहुत सरल है, और हर बार काफी समान है, उदा।

{"अक्षांश":50.2905,"देशांतर":5.04548,"recorded_at":"20200925 21:07:31",,"स्वामी":1}।

कभी-कभी इसे बिना किसी त्रुटि के स्वीकार कर लिया जाता है। त्रुटियाँ तब होती हैं जब डेटा वाईफाई/ब्रॉडबैंड के माध्यम से या 4 जी के माध्यम से भेजा जाता है। डेटा भेजने वाला (Xamarin) कोड इस प्रकार है:

    private string UploadResult(WebClient client, double lat, double lng, DateTime t)
    {
        client.Headers[HttpRequestHeader.ContentType] = "application/json";

        lat = Math.Round(lat, 5);
        lng = Math.Round(lng, 5);
        json = string.Format("{{\"latitude\":{0},\"longitude\":{1},\"recorded_at\":\"{2}\",\"owner\":{3}}}",
            lat, lng, DBTime(t), MyLocation.owner);
        Uri uri = new Uri(UrlBase.urlBase + "SaveLocation");
        string result = client.UploadString(uri, json);
        return result;
    }

मेरे पास इसे डीबग करने के लिए सर्वर तक पहुंच नहीं है, केवल डेटाबेस प्रविष्टियों को देखने के लिए। यह एक MSSQL डेटाबेस में डेटा संग्रहीत करने वाली WCF सेवा है, और लेट/लॉन्ग को दशमलव (10,6) के रूप में संग्रहीत किया जाता है। मुझे पूरा यकीन है कि समस्या हाल ही में है, भले ही प्रासंगिक कोड नहीं बदला है - मुझे पहले ये त्रुटियां नहीं मिल रही थीं (वैसे भी नहीं)।

मैंने इधर-उधर बहुत खोजबीन की और बहुत सारे कोड परिवर्तनों की कोशिश की, जिनका कोई प्रभाव नहीं पड़ा। मुझे Visual Stuio, Xamarin और Android API स्तरों के विभिन्न संस्करणों के साथ एक ही समस्या थी।

आखिरकार मैंने पोस्ट करने से पहले अक्षांश और देशांतर की सटीकता को कम करने की कोशिश की, यानी।

        lat = Math.Round(lat, 1);
        lng = Math.Round(lng, 1);

और बिंगो!, सब ठीक है (मेरे डेटाबेस की सटीकता को छोड़कर)। 2 दशमलव स्थान या अधिक होने से त्रुटियाँ वापस आती हैं।

स्पष्ट रूप से सर्वर कोड को केवल पूर्णांकों को स्वीकार करने के लिए बदला जा सकता है, और डेटा को अलग तरीके से भेजा जा सकता है, लेकिन यह मुश्किल होने वाला है। इसका समाधान करने के लिए मैं क्लाइंट कोड में क्या परिवर्तन कर सकता हूँ?

[बाद में] मैंने दशमलव संख्याओं के लिए सही स्ट्रिंग प्रारूप जोड़ने का प्रयास किया

        json = string.Format("{{\"latitude\":{0:0.0000},\"longitude\":{1:0.0000},\"recorded_at\":\"{2}\",\"owner\":{3}}}", ....
 

लेकिन इससे कोई फर्क नहीं पड़ा। दिलचस्प बात यह है कि मैंने संख्याओं को तार के रूप में भेजने का भी प्रयास किया

        json = string.Format("{{\"latitude\":\"{0}\",\"longitude\":\"{1}\",\"recorded_at\":\"{2}\",\"owner\":{3}}}", ......
     

और वह उतना ही स्वीकार किया गया था, लेकिन उसी त्रुटि आवृत्ति के साथ। जैसा कि मैं इसे समझता हूं, संख्यात्मक डेटा को तार के रूप में खारिज कर दिया जाना चाहिए था।

0
quilkin 26 सितंबर 2020, 15:48

1 उत्तर

सबसे बढ़िया उत्तर

WebClient को HttpClient में बदलकर इसे हल किया। मुझे पता था कि वेब क्लाइंट पुरानी तकनीक है, लेकिन मैंने मूल कोड सदियों पहले लिखा था और यह निश्चित रूप से ठीक काम करता था।

    private async Task<HttpResponseMessage> UploadResult(double lat, double lng, DateTime t)
    {
        lat = Math.Round(lat, 5);
        lng = Math.Round(lng, 5);
        using (HttpClient httpClient = new HttpClient())
        {
            string json = string.Format("{{\"latitude\":{0:0.00000},\"longitude\":{1:0.00000},\"recorded_at\":\"{2}\",\"owner\":{3}}}",
            lat, lng, DBTime(t), Location.owner);
            var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
            HttpResponseMessage response = null;
            Uri uri = new Uri(UrlBase.urlBase + "SaveLocation");
            try
            {
               response = await httpClient.PostAsync(uri, content);
            }
            catch (Exception ex)
            {
                if (response == null)
                {
                    response = new HttpResponseMessage();
                }
                response.StatusCode = HttpStatusCode.InternalServerError;
                response.ReasonPhrase = string.Format("Post failed: {0}", ex.Message);

            }
            return response;

        }
    }

इस फ़ंक्शन को प्रतीक्षा के साथ भी कॉल करने की आवश्यकता है।

0
quilkin 29 सितंबर 2020, 19:50