2010-10-08 53 views

回答

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參數值,並始終使用虛假的值呢? – 2014-03-25 19:02:21

+0

修好了,謝謝喬恩。 – cement 2015-01-06 01:20:56

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 2010-10-08 15:44:41

+0

我需要發送一個請求XML到服務器並讀取響應。 如何發送請求?我是否以某種方式連接到URL? 例如: 站點URL:http://remoteserver.com XML派:<請求V1 = 「ABC」 V2 = 「123」/> yaronkl 2017-07-27 07:59:52

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; 

希望它可以幫助

相關問題