c# HttpClient का उपयोग करते समय HttpContent के अंदर बड़ी स्ट्रिंग कैसे सेट करें?




.net asp.net-web-api (3)

यह कोड मेरे लिए काम करता है, मूल रूप से आप http क्लाइंट पर स्ट्रिंग सामग्री के भीतर पोस्ट डेटा "एप्लिकेशन / एक्स-www-form-urlencoded" भेजते हैं, उम्मीद है कि यह मेरे जैसे ही समस्या वाले किसी की भी मदद कर सकता है

void sendDocument()
    {
        string url = "www.mysite.com/page.php";
        StringBuilder postData = new StringBuilder();
        postData.Append(String.Format("{0}={1}&", HttpUtility.HtmlEncode("prop"), HttpUtility.HtmlEncode("value")));
        postData.Append(String.Format("{0}={1}", HttpUtility.HtmlEncode("prop2"), HttpUtility.HtmlEncode("value2")));
        StringContent myStringContent = new StringContent(postData.ToString(), Encoding.UTF8, "application/x-www-form-urlencoded");
        HttpClient client = new HttpClient();
        HttpResponseMessage message = client.PostAsync(url, myStringContent).GetAwaiter().GetResult();
        string responseContent = message.Content.ReadAsStringAsync().GetAwaiter().GetResult();
    }

इसलिए, मैंने एक HttpClient बनाया है और HttpClient.PostAsync() का उपयोग कर डेटा पोस्ट कर रहा हूं।

मैं HttpContent का उपयोग कर सेट

HttpContent content = new FormUrlEncodedContent(post_parameters) ; जहां post_parameters कुंजी मान जोड़े List<KeyValuePair<string, string>> एक सूची है

समस्या यह है कि, जब HttpContent का एक बड़ा मान होता है (एक छवि को ट्रांसमीटर करने के लिए बेस 64 में कनवर्ट किया जाता है) मुझे एक यूआरएल बहुत लंबी त्रुटि मिलती है। यह समझ में आता है - यूआरएल 32,000 वर्णों से आगे नहीं जा सकता है। लेकिन अगर मैं इस तरह से डेटा को HttpContent में कैसे जोड़ूं?

कृपया मदद करे।


मैंने इसे अपने दोस्त की मदद से समझ लिया। आप क्या करना चाहते हैं FormUrlEncodedContent () का उपयोग करने से बचें, क्योंकि इसमें यूरी के आकार पर प्रतिबंध हैं। इसके बजाए, आप निम्न कार्य कर सकते हैं:

    var jsonString = JsonConvert.SerializeObject(post_parameters);
    var content = new StringContent(jsonString, Encoding.UTF8, "application/json");

यहां, हमें सर्वर पर पोस्ट करने के लिए HttpContent का उपयोग करने की आवश्यकता नहीं है, स्ट्रिंगकंटेंट को काम पूरा हो जाता है!


FormUrlEncodedContent आंतरिक रूप से Uri.EscapeDataString का उपयोग करता है: प्रतिबिंब से, मैं देख सकता हूं कि इस विधि में अनुरोध लंबाई के आकार को सीमित करने वाले स्थिरांक हैं।

इस सीमा को बाईपास करने के लिए System.Net.WebUtility.UrlEncode (.net 4.5) का उपयोग करके FormUrlEncodedContent का नया कार्यान्वयन करना एक संभावित समाधान है।

public class MyFormUrlEncodedContent : ByteArrayContent
{
    public MyFormUrlEncodedContent(IEnumerable<KeyValuePair<string, string>> nameValueCollection)
        : base(MyFormUrlEncodedContent.GetContentByteArray(nameValueCollection))
    {
        base.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
    }
    private static byte[] GetContentByteArray(IEnumerable<KeyValuePair<string, string>> nameValueCollection)
    {
        if (nameValueCollection == null)
        {
            throw new ArgumentNullException("nameValueCollection");
        }
        StringBuilder stringBuilder = new StringBuilder();
        foreach (KeyValuePair<string, string> current in nameValueCollection)
        {
            if (stringBuilder.Length > 0)
            {
                stringBuilder.Append('&');
            }

            stringBuilder.Append(MyFormUrlEncodedContent.Encode(current.Key));
            stringBuilder.Append('=');
            stringBuilder.Append(MyFormUrlEncodedContent.Encode(current.Value));
        }
        return Encoding.Default.GetBytes(stringBuilder.ToString());
    }
    private static string Encode(string data)
    {
        if (string.IsNullOrEmpty(data))
        {
            return string.Empty;
        }
        return System.Net.WebUtility.UrlEncode(data).Replace("%20", "+");
    }
}

बड़ी सामग्री भेजने के लिए, StreamContent का उपयोग करना बेहतर है।





httpcontent