2010-10-08 11 views
19

का उपयोग करके प्रतिक्रिया प्राप्त करें मुझे पोस्ट किए गए पैरामीटर के आधार पर प्रतिक्रिया में फ़ाइल डाउनलोड करने के लिए एक URL (https://somesite.com) पर डेटा पोस्ट करने की आवश्यकता है। मैं सी # कंसोल एप्लिकेशन का उपयोग करके ऐसा कैसे कर सकता हूं?HTTP पोस्ट अनुरोध बनाएं और सी # कंसोल एप्लिकेशन

पैरामीटर: फ़ाइल नाम, userid, पासवर्ड, प्रकार

उत्तर

14

System.Net.WebClient वर्ग पर एक नजर डालें, तो यह अनुरोध जारी और अपनी प्रतिक्रिया संभाल, साथ ही फ़ाइलों को डाउनलोड करने के लिए इस्तेमाल किया जा सकता है:

http://www.hanselman.com/blog/HTTPPOSTsAndHTTPGETsWithWebClientAndCAndFakingAPostBack.aspx

http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.90).aspx

31
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.IO; 

namespace WebserverInteractionClassLibrary 
{ 
    public class RequestManager 
    { 
     public string LastResponse { protected set; get; } 

     CookieContainer cookies = new CookieContainer(); 

     internal string GetCookieValue(Uri SiteUri,string name) 
     { 
      Cookie cookie = cookies.GetCookies(SiteUri)[name]; 
      return (cookie == null) ? null : cookie.Value; 
     } 

     public string GetResponseContent(HttpWebResponse response) 
     { 
      if (response == null) 
      { 
       throw new ArgumentNullException("response"); 
      } 
      Stream dataStream = null; 
      StreamReader reader = null; 
      string responseFromServer = null; 

      try 
      { 
       // Get the stream containing content returned by the server. 
       dataStream = response.GetResponseStream(); 
       // Open the stream using a StreamReader for easy access. 
       reader = new StreamReader(dataStream); 
       // Read the content. 
       responseFromServer = reader.ReadToEnd(); 
       // Cleanup the streams and the response. 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
      finally 
      {     
       if (reader != null) 
       { 
        reader.Close(); 
       } 
       if (dataStream != null) 
       { 
        dataStream.Close(); 
       } 
       response.Close(); 
      } 
      LastResponse = responseFromServer; 
      return responseFromServer; 
     } 

     public HttpWebResponse SendPOSTRequest(string uri, string content, string login, string password, bool allowAutoRedirect) 
     { 
      HttpWebRequest request = GeneratePOSTRequest(uri, content, login, password, allowAutoRedirect); 
      return GetResponse(request); 
     } 

     public HttpWebResponse SendGETRequest(string uri, string login, string password, bool allowAutoRedirect) 
     { 
      HttpWebRequest request = GenerateGETRequest(uri, login, password, allowAutoRedirect); 
      return GetResponse(request); 
     } 

     public HttpWebResponse SendRequest(string uri, string content, string method, string login, string password, bool allowAutoRedirect) 
     { 
      HttpWebRequest request = GenerateRequest(uri, content, method, login, password, allowAutoRedirect); 
      return GetResponse(request); 
     } 

     public HttpWebRequest GenerateGETRequest(string uri, string login, string password, bool allowAutoRedirect) 
     { 
      return GenerateRequest(uri, null, "GET", null, null, allowAutoRedirect); 
     } 

     public HttpWebRequest GeneratePOSTRequest(string uri, string content, string login, string password, bool allowAutoRedirect) 
     { 
      return GenerateRequest(uri, content, "POST", null, null, allowAutoRedirect); 
     } 

     internal HttpWebRequest GenerateRequest(string uri, string content, string method, string login, string password, bool allowAutoRedirect) 
     { 
      if (uri == null) 
      { 
       throw new ArgumentNullException("uri"); 
      } 
      // Create a request using a URL that can receive a post. 
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri); 
      // Set the Method property of the request to POST. 
      request.Method = method; 
      // Set cookie container to maintain cookies 
      request.CookieContainer = cookies; 
      request.AllowAutoRedirect = allowAutoRedirect; 
      // If login is empty use defaul credentials 
      if (string.IsNullOrEmpty(login)) 
      { 
       request.Credentials = CredentialCache.DefaultNetworkCredentials; 
      } 
      else 
      { 
       request.Credentials = new NetworkCredential(login, password); 
      } 
      if (method == "POST") 
      { 
       // Convert POST data to a byte array. 
       byte[] byteArray = Encoding.UTF8.GetBytes(content); 
       // Set the ContentType property of the WebRequest. 
       request.ContentType = "application/x-www-form-urlencoded"; 
       // Set the ContentLength property of the WebRequest. 
       request.ContentLength = byteArray.Length; 
       // Get the request stream. 
       Stream dataStream = request.GetRequestStream(); 
       // Write the data to the request stream. 
       dataStream.Write(byteArray, 0, byteArray.Length); 
       // Close the Stream object. 
       dataStream.Close(); 
      } 
      return request; 
     } 

     internal HttpWebResponse GetResponse(HttpWebRequest request) 
     { 
      if (request == null) 
      { 
       throw new ArgumentNullException("request"); 
      } 
      HttpWebResponse response = null; 
      try 
      { 
       response = (HttpWebResponse)request.GetResponse();     
       cookies.Add(response.Cookies);     
       // Print the properties of each cookie. 
       Console.WriteLine("\nCookies: "); 
       foreach (Cookie cook in cookies.GetCookies(request.RequestUri)) 
       { 
        Console.WriteLine("Domain: {0}, String: {1}", cook.Domain, cook.ToString()); 
       } 
      } 
      catch (WebException ex) 
      { 
       Console.WriteLine("Web exception occurred. Status code: {0}", ex.Status); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
      return response; 
     } 

    } 
} 
+0

ऐसा लगता है कि GenerateRequest विधि अपने allowAutoRedirect पैरामीटर मान पर ध्यान नहीं देता तरह मदद करता है, और हमेशा के बजाय झूठे के एक मूल्य का उपयोग करता है? –

+0

फिक्स्ड, धन्यवाद जॉन। – cement

8

इसके लिए आप बस .NET में "HttpWebRequest" और "HttpWebResponse" कक्षाओं का उपयोग कर सकते हैं।

नीचे एक नमूना कंसोल ऐप है जिसे मैंने यह प्रदर्शित करने के लिए लिखा है कि यह कितना आसान है।

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Net; 
using System.IO; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string url = "www.somewhere.com";  
      string fileName = @"C:\output.file"; 

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
      request.Timeout = 5000; 

      try 
      { 
       using (WebResponse response = (HttpWebResponse)request.GetResponse()) 
       { 
        using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) 
        { 
         byte[] bytes = ReadFully(response.GetResponseStream()); 

         stream.Write(bytes, 0, bytes.Length); 
        } 
       } 
      } 
      catch (WebException) 
      { 
       Console.WriteLine("Error Occured"); 
      } 
     } 

     public static byte[] ReadFully(Stream input) 
     { 
      byte[] buffer = new byte[16 * 1024]; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       int read; 
       while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        ms.Write(buffer, 0, read); 
       } 
       return ms.ToArray(); 
      } 
     } 
    } 
} 

आनंद लें!

+0

धन्यवाद। मुझे लगता है कि आपका कोड डाउनलोड करने के लिए है लेकिन मुझे दूरस्थ सर्वर पर डेटा पोस्ट करने के बारे में भी जानना है। – user470310

+0

मुझे सर्वर पर अनुरोध एक्सएमएल भेजने और प्रतिक्रिया पढ़ने की जरूरत है। मैं अनुरोध कैसे भेजूं? क्या मैं इसे यूआरएल में किसी तरह से जोड़ता हूं? उदाहरण के लिए: साइट यूआरएल: http://remoteserver.com एक्सएमएल भेजने के लिए: <अनुरोध v1 = "abc" वी 2 = "123" /> yaronkl

1
HttpWebRequest request =(HttpWebRequest)WebRequest.Create("some url"); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 7.1; Trident/5.0)"; 
request.Accept = "/"; 
request.UseDefaultCredentials = true; 
request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials; 
doc.Save(request.GetRequestStream()); 
HttpWebResponse resp = request.GetResponse() as HttpWebResponse; 

आशा है कि यह

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