2009-09-24 15 views
15

मैंने एक http पोस्ट भेजने के इतने सारे कार्यान्वयन देखे हैं, और स्वीकार्य रूप से मुझे यह जानने के लिए अंतर्निहित विवरण पूरी तरह से समझ नहीं आता है कि क्या आवश्यक है।कैनोनिकल HTTP पोस्ट कोड?

सी # .NET 3.5 में HTTP पोस्ट भेजने के लिए संक्षिप्त/सही/कैनोलिक कोड क्या है?

मैं की तरह

public string SendPost(string url, string data) 

कि एक पुस्तकालय में जोड़ा जा सकता है और हमेशा डेटा पोस्ट करने के लिए इस्तेमाल किया और सर्वर प्रतिक्रिया वापस आ जाएगी एक सामान्य विधि चाहते हैं।

उत्तर

10

मुझे विश्वास है कि इस बात का सरल संस्करण

var client = new WebClient(); 
return client.UploadString(url, data); 

System.Net.WebClient वर्ग अन्य उपयोगी तरीकों कि आप डाउनलोड या तार या एक फ़ाइल, या बाइट्स अपलोड है किया जाएगा।

दुर्भाग्यवश वहां (अक्सर अक्सर) स्थितियां होती हैं जहां आपको अधिक काम करना पड़ता है। उदाहरण के लिए उपरोक्त स्थितियों का ख्याल नहीं रखता है जहां आपको प्रॉक्सी सर्वर के विरुद्ध प्रमाणित करने की आवश्यकता होती है (हालांकि यह IE के लिए डिफ़ॉल्ट प्रॉक्सी कॉन्फ़िगरेशन का उपयोग करेगा)।

इसके अलावा WebClient एकाधिक फ़ाइलें या सेटिंग (कुछ विशिष्ट) हेडर को अपलोड करने का समर्थन नहीं करता है और कभी कभी आप गहराई में जाने और बदले

System.Web.HttpWebRequest और System.Net.HttpWebResponse का उपयोग करना होगा।

+0

वेब क्लाइंट.उलोडोडरिंग के लिए +1! वेब क्लाइंट की सीमाओं के बारे में, एक आसान कामकाज है, मेरा जवाब देखें –

+0

एक आम बात जो मैं खुद को पाता हूं वह एक webservice पर एक्सएमएल पोस्ट कर रहा है। क्या इस परिदृश्य के लिए अपलोडस्ट्रिंग एक अच्छा विकल्प है? एन्कोडिंग के बारे में क्या? क्या यह यूटीएफ -16 है? – User

+0

आप वेब क्लाइंट की एन्कोडिंग प्रॉपर्टी का उपयोग करके एन्कोडिंग को यूएफटी -16 पर सेट कर सकते हैं। –

0

की तुलना करें:

// create a client object 
using(System.Net.WebClient client = new System.Net.WebClient()) { 
    // performs an HTTP POST 
    client.UploadString(url, xml); 

} 

string HttpPost (string uri, string parameters) 
{ 
    // parameters: name1=value1&name2=value2 
    WebRequest webRequest = WebRequest.Create (uri); 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.Method = "POST"; 
    byte[] bytes = Encoding.ASCII.GetBytes (parameters); 
    Stream os = null; 
    try 
    { // send the Post 
     webRequest.ContentLength = bytes.Length; //Count bytes to send 
     os = webRequest.GetRequestStream(); 
     os.Write (bytes, 0, bytes.Length);   //Send it 
    } 
    catch (WebException ex) 
    { 
     MessageBox.Show (ex.Message, "HttpPost: Request error", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
     if (os != null) 
     { 
     os.Close(); 
     } 
    } 

    try 
    { // get the response 
     WebResponse webResponse = webRequest.GetResponse(); 
     if (webResponse == null) 
     { return null; } 
     StreamReader sr = new StreamReader (webResponse.GetResponseStream()); 
     return sr.ReadToEnd().Trim(); 
    } 
    catch (WebException ex) 
    { 
     MessageBox.Show (ex.Message, "HttpPost: Response error", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    return null; 
} // end HttpPost 

को क्यों प्रयोग कर रहे हैं लोग/उत्तरार्द्ध लेखन?

+3

आम तौर पर क्योंकि हमें वास्तव में वेब क्लाइंट क्लास की अनुमति के अलावा अनुरोध को संशोधित करने की आवश्यकता है, विशेष रूप से यदि आप कुछ शीर्षलेख बदलना चाहते हैं तो वेब क्लाइंट ऐसा करने की क्षमता को प्रतिबंधित करता है, तो http://msdn.microsoft.com/ देखें en-us/library/system.net.webclient.headers.aspx – RobV

3

जैसा कि अन्य ने कहा है, WebClient.UploadString (या UploadData) जाने का रास्ता है।

हालांकि अंतर्निहित WebClient में एक बड़ी कमी है: आपके पास WebRequest पर लगभग कोई नियंत्रण नहीं है जिसका उपयोग दृश्य (कुकीज़, प्रमाणीकरण, कस्टम शीर्षलेख ...) के पीछे किया जाता है। उस समस्या को हल करने का एक आसान तरीका है अपने कस्टम WebClient बनाना और GetWebRequest विधि को ओवरराइड करना। इसके बाद आप अनुरोध भेजने से पहले अनुरोध को कस्टमाइज़ कर सकते हैं (आप GetWebResponse ओवरराइड करके प्रतिक्रिया के लिए भी ऐसा कर सकते हैं)। कुकी-जागरूक WebClient के an example यहां है। यह इतना आसान है कि यह मुझे आश्चर्यचकित करता है कि अंतर्निर्मित वेब क्लाइंट इसे आउट-ऑफ-द-बॉक्स क्यों नहीं संभालता है ...

+0

कूल, लिंक के लिए धन्यवाद! –

संबंधित मुद्दे