System.Net.HttpClient के लिए क्वेरी स्ट्रिंग बनाएँ


184

अगर मैं System.Net। Http का उपयोग करके http पाने के लिए अनुरोध प्रस्तुत करना चाहता हूं। ऐसा लगता है कि पैरामीटर जोड़ने के लिए कोई एपीआई नहीं है, क्या यह सही है?

क्या क्वेरी स्ट्रिंग बनाने के लिए कोई सरल एपीआई उपलब्ध है जिसमें एक नाम मान संग्रह का निर्माण शामिल नहीं है और जो उकसाना और फिर अंत में उन्हें समेटना है? मुझे रेस्टशार के आपी (यानी AddParameter (..)) जैसे कुछ का उपयोग करने की उम्मीद थी


@ मिचेल पेरेनॉउड आप वर्णों के साथ स्वीकृत उत्तर का उपयोग करके पुनर्विचार करना चाह सकते हैं जिन्हें एन्कोडिंग की आवश्यकता है, नीचे मेरी व्याख्या देखें
अवैध-आप्रवासी

जवाबों:


309

अगर मैं System.Net। Http का उपयोग करके http पाने के लिए अनुरोध प्रस्तुत करना चाहता हूं। ऐसा लगता है कि पैरामीटर जोड़ने के लिए कोई एपीआई नहीं है, क्या यह सही है?

हाँ।

क्या क्वेरी स्ट्रिंग बनाने के लिए कोई सरल एपीआई उपलब्ध है जिसमें एक नाम मान संग्रह का निर्माण शामिल नहीं है और जो उकसाना और फिर अंत में उन्हें समेटना है?

ज़रूर:

var query = HttpUtility.ParseQueryString(string.Empty);
query["foo"] = "bar<>&-baz";
query["bar"] = "bazinga";
string queryString = query.ToString();

आपको अपेक्षित परिणाम देगा:

foo=bar%3c%3e%26-baz&bar=bazinga

आपको UriBuilderकक्षा उपयोगी भी लग सकती है:

var builder = new UriBuilder("http://example.com");
builder.Port = -1;
var query = HttpUtility.ParseQueryString(builder.Query);
query["foo"] = "bar<>&-baz";
query["bar"] = "bazinga";
builder.Query = query.ToString();
string url = builder.ToString();

आपको अपेक्षित परिणाम देगा:

http://example.com/?foo=bar%3c%3e%26-baz&bar=bazinga

कि आप अपनी HttpClient.GetAsyncविधि से सुरक्षित रूप से फ़ीड कर सकते हैं ।


9
.NET में url हैंडलिंग के मामले में यह सबसे अच्छा है। कभी भी मैन्युअल रूप से एन्कोडिंग और स्ट्रिंग कॉन्टेक्टेंशन या स्ट्रिंग बिल्डर्स या जो कुछ भी करने की आवश्यकता नहीं है। UriBuilder वर्ग भी #Fragment संपत्ति का उपयोग करके आपके लिए टुकड़ों ( ) के साथ url संभाल लेगा । मैंने बहुत से लोगों को अंतर्निहित उपकरणों का उपयोग करने के बजाय मैन्युअल रूप से url को संभालने की गलती करते देखा है।
डारिन दिमित्रोव 20

6
NameValueCollection.ToString()सामान्य रूप से क्वेरी स्ट्रिंग नहीं है, और कोई प्रलेखन करते हुए कहा कि एक कर रहा है ToStringके परिणाम पर ParseQueryStringवहाँ के रूप में है कि कार्यक्षमता में कोई गारंटी नहीं है एक नई क्वेरी स्ट्रिंग में परिणाम होगा, इस प्रकार किसी भी समय टूट सकता है।
मैथ्यू

11
HttpUtility System.Web में है जो पोर्टेबल रनटाइम पर उपलब्ध नहीं है। यह अजीब लगता है कि यह कार्यक्षमता कक्षा के पुस्तकालयों में अधिक आम तौर पर उपलब्ध नहीं है।
क्रिस Eldredge

82
यह समाधान तुच्छ है। .Net के पास उचित querystring बिल्डर होना चाहिए।
कुगेल

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

79

जो लोग शामिल करने के लिए नहीं करना चाहते हैं के लिए System.Webपरियोजनाओं कि पहले से ही उसका उपयोग नहीं करते, तो आप उपयोग कर सकते हैं FormUrlEncodedContentसे System.Net.Httpऔर निम्नलिखित की तरह कुछ कार्य करें:

keyvaluepair संस्करण

string query;
using(var content = new FormUrlEncodedContent(new KeyValuePair<string, string>[]{
    new KeyValuePair<string, string>("ham", "Glazed?"),
    new KeyValuePair<string, string>("x-men", "Wolverine + Logan"),
    new KeyValuePair<string, string>("Time", DateTime.UtcNow.ToString()),
})) {
    query = content.ReadAsStringAsync().Result;
}

शब्दकोश संस्करण

string query;
using(var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
    { "ham", "Glaced?"},
    { "x-men", "Wolverine + Logan"},
    { "Time", DateTime.UtcNow.ToString() },
})) {
    query = content.ReadAsStringAsync().Result;
}

आप एक कथन का उपयोग क्यों करते हैं?
इयान वारबर्टन

संसाधनों को मुक्त करने की संभावना है, लेकिन यह शीर्ष पर है। यह मत करो।
कोड़ी

5
KVP सरणी के बजाय शब्दकोश <string, string> का उपयोग करके यह अधिक संक्षिप्त हो सकता है। तब के शुरुआती सिंटैक्स का उपयोग करते हुए: {"हैम", "ग्लेज्ड?" }
सीन बी

@ सीन एक अच्छा विचार है, खासकर जब मापदंडों के एक गतिशील / अज्ञात सूची को जोड़ने के लिए कुछ का उपयोग करते हुए। इस उदाहरण के लिए चूंकि यह एक "निश्चित" सूची है, मुझे ऐसा नहीं लगा कि किसी शब्दकोश का ओवरहेड इसके लायक था।
रोस्तोव

6
@ कोडी आप का उपयोग क्यों नहीं करने के लिए कहते हैं dispose? मैं हमेशा निपटाता हूं जब तक मेरे पास एक अच्छा कारण नहीं है, जैसे पुन: उपयोग करना HttpClient
डैन फ्रीडमैन

41

TL; DR: स्वीकार किए गए संस्करण का उपयोग न करें क्योंकि यह यूनिकोड वर्णों को संभालने के संबंध में पूरी तरह से टूट गया है, और कभी भी आंतरिक API का उपयोग नहीं करता है

मुझे वास्तव में स्वीकृत समाधान के साथ अजीब डबल एन्कोडिंग मुद्दा मिला है:

इसलिए, यदि आप उन वर्णों के साथ काम कर रहे हैं जिन्हें एन्कोडेड करने की आवश्यकता है, तो स्वीकृत समाधान दोहरे एन्कोडिंग की ओर जाता है:

  • NameValueCollectionइंडेक्सर का उपयोग करके क्वेरी पैरामीटर ऑटो एनकोडेड हैं ( और यह उपयोग करता है UrlEncodeUnicode, नियमित रूप से अपेक्षित नहीं UrlEncode! ( )
  • फिर, जब आप कॉल करते हैं तो uriBuilder.Uriयह नया Uriप्रयोग करता है कंस्ट्रक्टर जो एक बार (सामान्य यूआरएल एन्कोडिंग) एन्कोडिंग करता है
  • ऐसा करने से बचा नहीं जा सकता हैuriBuilder.ToString() (भले ही यह सही हो Uriजो IMO कम से कम असंगति है, शायद एक बग है, लेकिन यह एक और सवाल है) और फिर HttpClientस्ट्रिंग को स्वीकार करने की विधि का उपयोग करना - क्लाइंट अभी भी Uriइस तरह से आपके पास किए गए स्ट्रिंग से बाहर निकलता है:new Uri(uri, UriKind.RelativeOrAbsolute)

छोटा, लेकिन पूर्ण रेपो:

var builder = new UriBuilder
{
    Scheme = Uri.UriSchemeHttps,
    Port = -1,
    Host = "127.0.0.1",
    Path = "app"
};

NameValueCollection query = HttpUtility.ParseQueryString(builder.Query);

query["cyrillic"] = "кирилиця";

builder.Query = query.ToString();
Console.WriteLine(builder.Query); //query with cyrillic stuff UrlEncodedUnicode, and that's not what you want

var uri = builder.Uri; // creates new Uri using constructor which does encode and messes cyrillic parameter even more
Console.WriteLine(uri);

// this is still wrong:
var stringUri = builder.ToString(); // returns more 'correct' (still `UrlEncodedUnicode`, but at least once, not twice)
new HttpClient().GetStringAsync(stringUri); // this creates Uri object out of 'stringUri' so we still end up sending double encoded cyrillic text to server. Ouch!

आउटपुट:

?cyrillic=%u043a%u0438%u0440%u0438%u043b%u0438%u0446%u044f

https://127.0.0.1/app?cyrillic=%25u043a%25u0438%25u0440%25u0438%25u043b%25u0438%25u0446%25u044f

जैसा कि आप देख सकते हैं, अगर आप कोई फर्क नहीं पड़ता uribuilder.ToString()+ httpClient.GetStringAsync(string)या uriBuilder.Uri+ httpClient.GetStringAsync(Uri)आप डबल एन्कोडेड पैरामीटर भेज अंत

निश्चित उदाहरण हो सकता है:

var uri = new Uri(builder.ToString(), dontEscape: true);
new HttpClient().GetStringAsync(uri);

लेकिन यह अप्रचलित Uri कंस्ट्रक्टर का उपयोग करता है

Windows सर्वर पर मेरे नवीनतम .NET पर PS, Uriबूल डॉक टिप्पणी के साथ कंस्ट्रक्टर "अप्रचलित, NOTEscape हमेशा गलत है", लेकिन वास्तव में अपेक्षित रूप से काम करता है (स्किप्स एस्केपिंग)

तो यह एक और बग की तरह लग रहा है ...

और यहां तक ​​कि यह सामान्य गलत है - यह सर्वर को UrlEncodedUnicode भेजता है, न कि केवल UrlEncoded सर्वर को इसकी अनुमति देता है

अद्यतन: एक और बात है, NameValueCollection वास्तव में UrlEncodeUnicode करता है, जिसे अब उपयोग नहीं किया जाना है और नियमित url.encode / decode ( URL Query के लिए NameValueCollection देखें ) के साथ असंगत है ।

इसलिए नीचे की रेखा है: इस हैक का उपयोग कभी न करेंNameValueCollection query = HttpUtility.ParseQueryString(builder.Query); क्योंकि यह आपके यूनिकोड क्वेरी मापदंडों को गड़बड़ कर देगा। बस मैन्युअल रूप से क्वेरी बनाएं और इसे असाइन करें UriBuilder.Queryजो आवश्यक एन्कोडिंग करेगा और फिर उरी का उपयोग कर प्राप्त करेगा UriBuilder.Uri

कोड का उपयोग करके खुद को चोट पहुंचाने का प्रमुख उदाहरण जो इस तरह का उपयोग करने वाला नहीं है


16
क्या आप इस उत्तर में पूर्ण उपयोगिता फ़ंक्शन जोड़ सकते हैं जो काम करता है?
मफू

8
मैं इस पर दूसरा mafu: मैं जवाब के माध्यम से पढ़ा है, लेकिन एक निष्कर्ष नहीं है। क्या इसका कोई निश्चित उत्तर है?
रिचर्ड ग्रिफ़िथ्स

3
मैं इस समस्या के लिए निश्चित उत्तर भी देखना चाहता हूं
Pones

इस समस्या का निश्चित उत्तर का उपयोग करना है var namedValues = HttpUtility.ParseQueryString(builder.Query), लेकिन फिर लौटे NameValueCollection का उपयोग करने के बजाय, इसे तुरंत एक शब्दकोश में परिवर्तित करें जैसे: शब्दकोश में var dic = values.ToDictionary(x => x, x => values[x]); नए मान जोड़ें, फिर इसे बनाने वाले को पास FormUrlEncodedContentकरें और ReadAsStringAsync().Resultउस पर कॉल करें । यह आपको ठीक से एन्कोडेड क्वेरी स्ट्रिंग देता है, जिसे आप वापस UriBuilder को असाइन कर सकते हैं।
त्रिंको

आप वास्तव में सभी के बजाय केवल NamedValueCollection.ToString का उपयोग कर सकते हैं , लेकिन केवल तभी जब आप एक app.config / web.config सेटिंग बदलते हैं जो ASP.NET को '% uXXXX' एन्कोडिंग का उपयोग करने से रोकता है <add key="aspnet:DontUsePercentUUrlEncoding" value="true" />:। मैं इस व्यवहार पर निर्भर नहीं होता, इसलिए बेहतर है कि FormUrlEncodedContent क्लास का उपयोग करें, जैसा कि पहले वाले उत्तर में दिखाया गया है: stackoverflow.com/a/26744471/88409
Triynko

41

ASP.NET कोर प्रोजेक्ट में आप QueryHelpers वर्ग का उपयोग कर सकते हैं।

// using Microsoft.AspNetCore.WebUtilities;
var query = new Dictionary<string, string>
{
    ["foo"] = "bar",
    ["foo2"] = "bar2",
    // ...
};

var response = await client.GetAsync(QueryHelpers.AddQueryString("/api/", query));

2
यह कष्टप्रद है कि इस प्रक्रिया के साथ आप अभी भी एक ही कुंजी के लिए कई मूल्य नहीं भेज सकते हैं। यदि आप "बार" और "बार 2" को सिर्फ फू के हिस्से के रूप में भेजना चाहते हैं, तो यह संभव नहीं है।
m0g

2
यह आधुनिक ऐप्स के लिए एक बेहतरीन उत्तर है, मेरे परिदृश्य में काम करता है, सरल और साफ। हालांकि, मुझे किसी भी भागने के तंत्र की आवश्यकता नहीं है - परीक्षण नहीं किया गया।
पैट्रिक स्टाल्फ

यह NuGet पैकेज लक्ष्य .NET मानक 2.0 है जिसका अर्थ है कि आप इसे पूर्ण .NET फ्रेमवर्क 4.6.1+
eddiewould

24

आप Flurl [प्रकटीकरण: मैं लेखक हूं] की जांच करना चाहता हूं, वैकल्पिक साथी काम के साथ एक धाराप्रवाह यूआरएल बिल्डर जो इसे पूर्ण विकसित आरईएसटी क्लाइंट में विस्तारित करता है।

var result = await "https://api.com"
    // basic URL building:
    .AppendPathSegment("endpoint")
    .SetQueryParams(new {
        api_key = ConfigurationManager.AppSettings["SomeApiKey"],
        max_results = 20,
        q = "Don't worry, I'll get encoded!"
    })
    .SetQueryParams(myDictionary)
    .SetQueryParam("q", "overwrite q!")

    // extensions provided by Flurl.Http:
    .WithOAuthBearerToken("token")
    .GetJsonAsync<TResult>();

की जाँच करें डॉक्स अधिक जानकारी के लिए। पूरा पैकेज NuGet पर उपलब्ध है:

PM> Install-Package Flurl.Http

या केवल स्टैंड-अलोन URL बिल्डर:

PM> Install-Package Flurl


2
Uriइसके बजाय अपने वर्ग के साथ विस्तार या शुरुआत क्यों नहीं करते string?
मप्र

2
तकनीकी रूप से मैंने अपनी Urlकक्षा से शुरुआत की । ऊपर new Url("https://api.com").AppendPathSegment...व्यक्तिगत रूप से बराबर है मैं कम कीस्ट्रोक्स के कारण स्ट्रिंग एक्सटेंशन पसंद करता हूं और उन पर डॉक्स में मानकीकृत हूं, लेकिन आप इसे किसी भी तरह से कर सकते हैं।
टॉड मेनियर

विषय से बाहर, लेकिन वास्तव में अच्छा है, मैं इसे देखने के बाद इसका उपयोग कर रहा हूं। IHttpClientFactory का उपयोग करने के लिए धन्यवाद।
एड एस।

4

रोस्तोव पद के रूप में ही पंक्तियों के साथ, अगर आप के लिए एक संदर्भ में शामिल नहीं करना चाहते हैं System.Webअपनी परियोजना में, आप उपयोग कर सकते हैं FormDataCollectionसे System.Net.Http.Formattingऔर निम्नलिखित की तरह कुछ कार्य करें:

का उपयोग करते हुए System.Net.Http.Formatting.FormDataCollection

var parameters = new Dictionary<string, string>()
{
    { "ham", "Glaced?" },
    { "x-men", "Wolverine + Logan" },
    { "Time", DateTime.UtcNow.ToString() },
}; 
var query = new FormDataCollection(parameters).ReadAsNameValueCollection().ToString();

3

डारिन ने एक दिलचस्प और चतुर समाधान पेश किया, और यहां कुछ ऐसा है जो एक और विकल्प हो सकता है:

public class ParameterCollection
{
    private Dictionary<string, string> _parms = new Dictionary<string, string>();

    public void Add(string key, string val)
    {
        if (_parms.ContainsKey(key))
        {
            throw new InvalidOperationException(string.Format("The key {0} already exists.", key));
        }
        _parms.Add(key, val);
    }

    public override string ToString()
    {
        var server = HttpContext.Current.Server;
        var sb = new StringBuilder();
        foreach (var kvp in _parms)
        {
            if (sb.Length > 0) { sb.Append("&"); }
            sb.AppendFormat("{0}={1}",
                server.UrlEncode(kvp.Key),
                server.UrlEncode(kvp.Value));
        }
        return sb.ToString();
    }
}

और इसलिए इसका उपयोग करते समय, आप ऐसा कर सकते हैं:

var parms = new ParameterCollection();
parms.Add("key", "value");

var url = ...
url += "?" + parms;

5
आप लूप के लिए kvp.Keyऔर kvp.Valueअलग-अलग अंदर एनकोड करना चाहेंगे , न कि फुल क्वेरी-स्ट्रिंग (इस प्रकार एन्कोडिंग &और =कैरेक्टर नहीं)।
मैथ्यू

धन्यवाद माइक। अन्य प्रस्तावित समाधान (NameValueCollection को शामिल करते हुए) मेरे लिए काम नहीं किया क्योंकि मैं एक पीसीएल परियोजना में हूं, इसलिए यह एक सही विकल्प था। अन्य जो क्लाइंट पक्ष पर काम कर रहे के लिए, server.UrlEncodeसाथ बदला जा सकताWebUtility.UrlEncode
बीसीए

2

या बस मेरे उरी एक्सटेंशन का उपयोग कर रहे हैं

कोड

public static Uri AttachParameters(this Uri uri, NameValueCollection parameters)
{
    var stringBuilder = new StringBuilder();
    string str = "?";
    for (int index = 0; index < parameters.Count; ++index)
    {
        stringBuilder.Append(str + parameters.AllKeys[index] + "=" + parameters[index]);
        str = "&";
    }
    return new Uri(uri + stringBuilder.ToString());
}

प्रयोग

Uri uri = new Uri("http://www.example.com/index.php").AttachParameters(new NameValueCollection
                                                                           {
                                                                               {"Bill", "Gates"},
                                                                               {"Steve", "Jobs"}
                                                                           });

परिणाम

http://www.example.com/index.php?Bill=Gates&Steve=Jobs


27
क्या आप URL एन्कोडिंग नहीं भूले?
कुगेल

1
यह स्पष्ट, उपयोगी सहायक बनाने के लिए एक्सटेंशन का उपयोग करने का एक शानदार उदाहरण है। क्या आप एक ठोस RestClient के निर्माण के लिए अपने रास्ते पर स्वीकार किए जाते हैं जवाब के साथ इस जोड़ देते हैं तो
इमरान

2

आरएफसी 6570 यूआरआई खाका पुस्तकालय मैं विकासशील हूँ इस कार्य को करते में सक्षम है। सभी एन्कोडिंग को उस RFC के अनुसार आपके लिए संभाला जाता है। इस लेखन के समय, एक बीटा रिलीज़ उपलब्ध है और एकमात्र कारण यह नहीं माना जाता है कि एक स्थिर 1.0 रिलीज़ है प्रलेखन पूरी तरह से मेरी अपेक्षाओं को पूरा नहीं करता है (देखें मुद्दों # 17 , # 18 , # 32 , # 43 )।

आप या तो एक क्वेरी स्ट्रिंग अकेले बना सकते हैं:

UriTemplate template = new UriTemplate("{?params*}");
var parameters = new Dictionary<string, string>
  {
    { "param1", "value1" },
    { "param2", "value2" },
  };
Uri relativeUri = template.BindByName(parameters);

या आप एक पूर्ण URI का निर्माण कर सकते हैं:

UriTemplate template = new UriTemplate("path/to/item{?params*}");
var parameters = new Dictionary<string, string>
  {
    { "param1", "value1" },
    { "param2", "value2" },
  };
Uri baseAddress = new Uri("http://www.example.com");
Uri relativeUri = template.BindByName(baseAddress, parameters);

1

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

public class UriBuilderExt
{
    private NameValueCollection collection;
    private UriBuilder builder;

    public UriBuilderExt(string uri)
    {
        builder = new UriBuilder(uri);
        collection = System.Web.HttpUtility.ParseQueryString(string.Empty);
    }

    public void AddParameter(string key, string value) {
        collection.Add(key, value);
    }

    public Uri Uri{
        get
        {
            builder.Query = collection.ToString();
            return builder.Uri;
        }
    }

}

उपयोग कुछ इस तरह से सरल हो जाएगा:

var builder = new UriBuilderExt("http://example.com/");
builder.AddParameter("foo", "bar<>&-baz");
builder.AddParameter("bar", "second");
var uri = builder.Uri;

वह उरई लौटाएगा: http://example.com/?foo=bar%3c%3e%26-baz&bar/sondond


1

Taras.roshko के उत्तर में वर्णित दोहरे एन्कोडिंग मुद्दे से बचने और क्वेरी पैरामीटर के साथ आसानी से काम करने की संभावना को बनाए रखने के लिए, आप uriBuilder.Uri.ParseQueryString()इसके बजाय उपयोग कर सकते हैं HttpUtility.ParseQueryString()


1

स्वीकृत उत्तर का अच्छा हिस्सा, HttpUtility.ParseQueryString () के बजाय UriBuilder.Uri.ParseQueryString () का उपयोग करने के लिए संशोधित

var builder = new UriBuilder("http://example.com");
var query = builder.Uri.ParseQueryString();
query["foo"] = "bar<>&-baz";
query["bar"] = "bazinga";
builder.Query = query.ToString();
string url = builder.ToString();

FYI करें: इसके लिए System.Net.Http के संदर्भ की आवश्यकता है क्योंकि ParseQueryString()विस्तार विधि भीतर नहीं है System
सनी पटेल

0

"डारिन दिमित्रोव" के लिए धन्यवाद, यह विस्तार के तरीके हैं।

 public static partial class Ext
{
    public static Uri GetUriWithparameters(this Uri uri,Dictionary<string,string> queryParams = null,int port = -1)
    {
        var builder = new UriBuilder(uri);
        builder.Port = port;
        if(null != queryParams && 0 < queryParams.Count)
        {
            var query = HttpUtility.ParseQueryString(builder.Query);
            foreach(var item in queryParams)
            {
                query[item.Key] = item.Value;
            }
            builder.Query = query.ToString();
        }
        return builder.Uri;
    }

    public static string GetUriWithparameters(string uri,Dictionary<string,string> queryParams = null,int port = -1)
    {
        var builder = new UriBuilder(uri);
        builder.Port = port;
        if(null != queryParams && 0 < queryParams.Count)
        {
            var query = HttpUtility.ParseQueryString(builder.Query);
            foreach(var item in queryParams)
            {
                query[item.Key] = item.Value;
            }
            builder.Query = query.ToString();
        }
        return builder.Uri.ToString();
    }
}

-1

एक शब्दकोश को QueryStringFormat में बदलने के लिए एक एक्सटेंशन विधि बनाने से बेहतर समाधान मुझे नहीं मिला। वलीद एके द्वारा प्रस्तावित समाधान अच्छा है।

मेरे समाधान का पालन करें:

विस्तार विधि बनाएँ:

public static class DictionaryExt
{
    public static string ToQueryString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary)
    {
        return ToQueryString<TKey, TValue>(dictionary, "?");
    }

    public static string ToQueryString<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, string startupDelimiter)
    {
        string result = string.Empty;
        foreach (var item in dictionary)
        {
            if (string.IsNullOrEmpty(result))
                result += startupDelimiter; // "?";
            else
                result += "&";

            result += string.Format("{0}={1}", item.Key, item.Value);
        }
        return result;
    }
}

और उन्हें:

var param = new Dictionary<string, string>
          {
            { "param1", "value1" },
            { "param2", "value2" },
          };
param.ToQueryString(); //By default will add (?) question mark at begining
//"?param1=value1&param2=value2"
param.ToQueryString("&"); //Will add (&)
//"&param1=value1&param2=value2"
param.ToQueryString(""); //Won't add anything
//"param1=value1&param2=value2"

1
यह समाधान मापदंडों के उचित URL एन्कोडिंग को याद कर रहा है और उन मानों के साथ काम नहीं करेगा जिनमें 'अमान्य' वर्ण हैं
जेवियर पॉइनास

उत्तर को अपडेट करने और एन्कोडिंग लाइन को जोड़ने के लिए स्वतंत्र महसूस करें, यह कोड की एक लाइन है!
डिएगो मेंडेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.