HttpClient हेडर जोड़ने से कुछ मानों के साथ एक स्वरूपण उत्पन्न होता है


84

यह Google क्लाउड मैसेजिंग के खिलाफ कोडिंग के संदर्भ में हुआ, लेकिन कहीं और लागू होता है।

निम्नलिखित को धयान मे रखते हुए:

var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("key=XXX");

तथा

var http = new HttpClient();
http.DefaultRequestHeaders.Add("Authorization", "key=XXX");

दोनों जो एक FormatException उत्पन्न करते हैं:

System.FormatException: मान कुंजी = XXX 'का प्रारूप अमान्य है।

समाधान बराबर चिह्न को हटाने के लिए है।

  1. परावर्तक में खुदाई से पता चलता है कि मान्यकरण और पार्सिंग कोड है जो एक नया हेडर मान जोड़ते समय चलता है। यह सब क्यों जरूरी है? क्या इस ग्राहक को हमारे रास्ते से बाहर नहीं होना चाहिए?

  2. आप बराबरी के चिन्ह से कैसे बच सकते हैं ताकि इस मूल्य को जोड़ना सफल हो जाए?


@SamIam GCN API को एक संदेश पोस्ट करने की कोशिश कर रहा है - जिसके लिए ऊपर दिखाई गई प्रारूप का उपयोग करके हेडर के रूप में एक सामान्य जानकारी भेजनी होगी। हालाँकि, यह HttpClient हेडर के लिए अनुमत मूल्यों के आसपास एक अधिक सामान्य प्रश्न है।
एंड्रयू

जवाबों:


179

यकीन नहीं तो अभी भी प्रासंगिक है, लेकिन मैं हाल ही में इस मुद्दे में भाग गया और शीर्ष लेख जानकारी जोड़ने के लिए एक अलग विधि को कॉल करके इसे हल करने में सक्षम था:

var http = new HttpClient();
http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");

2
आप इस विधि को HttpRequestMessage पर भी कॉल कर सकते हैं, यदि आप इसे डिफ़ॉल्ट हेडर में नहीं चाहते हैं
Ed Sykes

8
इसे उत्तर के रूप में चिह्नित किया गया है, भले ही मुझे अभी भी यह समझ में नहीं आया है कि मान्य मान पर अन्य विधि विफल क्यों हो रही है।
एंड्रयू

1
इसके अलावा, विंडोज 10 के httpclient
Sinaesthetic

4
मैं देख रहा हूं कि यह एक पुराना धागा है लेकिन मैं अभी इस मुद्दे @EdSykes में भाग गया हूं और HttpRequestMessageइसके बजाय उपयोग करने की कोशिश की है और इससे कोई फर्क नहीं पड़ा । TryAddWithoutValidationविधि मेरे लिए चाल किया था।
मैथ्यू ब्लाट

23

आपके "क्यों यह सब (पार्सिंग और सत्यापन) आवश्यक है" सवाल के लिए, इसका उत्तर है: यह HTTP मानक में परिभाषित किया गया है।

में HTTP / 1.1 और RFC2617 :, मूल्य एक प्रमाणीकरण हैडर (जैसे WWW-प्रमाणित और प्राधिकरण के रूप में) के दो भाग हैं एक योजना हिस्सा है, और एक पैरामीटर हिस्सा

HTTP बेसिक प्रमाणीकरण के लिए, योजना "बेसिक" है, और पैरामीटर "QWxhZGRpbjpvcGVuIHNNlc2FtZQ ==" जैसा हो सकता है , इसलिए पूरा हेडर बन जाता है:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

इसलिए आपका "कुंजी = XXX" सत्यापन पारित नहीं करता है, क्योंकि इसमें एक योजना का अभाव है।


पैरामीटर अनुभाग में कुंजी = मान होना मान्य है। Stackoverflow.com/a/19512506/55732 देखें
जॉन कुर्लाक

1
@ कुरलाक: की = वैल्यू केवल "ऑर्टिकल-परम" भाग के लिए मान्य है, संपूर्ण "क्रेडेंशियल्स" भाग के लिए नहीं। कोडकैस्टर की व्याख्या काफी सही नहीं है।
टेरी चांग

3
मैं वास्तव Bearerमें योजना के रूप में उपयोग कर रहा हूं , लेकिन यह अभी भी मुझे त्रुटि दिखा रहा है।
टॉम

1
मेरे पास "बेयरर" जैसे बेयरर के बाद एक जगह थी जो मुद्दों का कारण बन रही थी। मैंने नीचे @Robert स्टोक्स का उत्तर देखा जिसने मुझे इसे देखने में मदद की।
शांती

7

मुझे इस अपवाद के बारे में जानकारी मिली (निम्न स्वरूप में अल्पविराम के कारण मेरा प्रारूपप्रदर्शन) निम्नलिखित तरीके से प्राधिकरण हेडर को सेट कर रहा है:

var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value");
client.DefaultRequestHeaders.Authorization = authenticationHeaderValue;

5

मैं इस त्रुटि में भाग गया और इस पद पर ठोकर खाई जब मैंने एक प्राधिकरण शीर्ष लेख के अंत में एक स्थान जोड़ा।

this.bearerAuthHttpClient.DefaultRequestHeaders.Add("Authorization ", $"Bearer {token}");

आप प्राधिकरण के बाद अपमानजनक "" देख सकते हैं।

मेरे टाइपो को देखने से पहले मुझे लगभग 15 मिनट लगे ...


1

मैं आज सुबह कुछ सवालों से गुजर रहा हूं, जबकि एक बाहरी एपीआई से निपटना है जो पत्र के लिए एचटीटीपी युक्ति का पालन नहीं करता है।

मेरी पोस्टिंग के हिस्से के रूप में, वे चाहते हैं Content-Typeऔर Content-Disposition, जिसे HttpClientऑब्जेक्ट में नहीं जोड़ा जा सकता है । उन हेडर को जोड़ने के लिए, आपको एक HttpRequestMessage बनाने की आवश्यकता है । वहां पर, आपको Contentसंपत्ति में हेडर जोड़ने की आवश्यकता है ।

private HttpRequestMessage GetPostMessage(string uri, string contentType,
                                          string fileName, Stream content)
{    
    var request = new HttpRequestMessage
    {
        Content = new StreamContent(content),
        RequestUri = new Uri(uri),
        Method = HttpMethod.Post
    };

    // contentType = "video/mp4"
    request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);

    //Need TryAddWithoutValidation because of the equals sign in the value.
    request.Content
           .Headers
           .TryAddWithoutValidation("Content-Disposition",
                                    $"attachment; filename=\"{Path.GetFileName(fileName)}\"");

    // If there is no equals sign in your content disposition, this will work:
    // request.Content.Headers.ContentDisposition = 
    //    new ContentDispositionHeaderValue($"attachment; \"{Path.GetFileName(fileName)}\"");

    return request;
}

0

मेरे मामले में मैं एक बाइट [] RowVersion SQL फ़ील्ड से ETags स्ट्रिंग मान उत्पन्न कर रहा हूं। इसलिए मुझे उत्पन्न रैप को जोड़ने की आवश्यकता है। यानी AAAAAAAAF5s = स्ट्रिंग "निम्नानुसार ...

        var eTag = department.RowVersion.ToETagString();

        httpClient.DefaultRequestHeaders.Add(Microsoft.Net.Http.Headers.HeaderNames.IfMatch, $"\"{eTag}\"")


    public class DepartmentForHandleDto
    {
        public string Name { get; set; }
        public string GroupName { get; set; }
        public byte[] RowVersion { get; set; }
    }

    public static class ByteArrayExtensions
    {
        public static string ToETagString(this byte[] byteArray)
        {
            return Convert.ToBase64String(byteArray != null && byteArray.Length > 0 ? byteArray : new byte[8]);                    
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.