【问题标题】:Create HTTP post request and receive response using C# console application使用 C# 控制台应用程序创建 HTTP 发布请求并接收响应
【发布时间】:2019-11-01 04:36:54
【问题描述】:

我需要根据我发布的参数将数据发布到 URL (https://somesite.com) 以在 responseStrem 中下载文件。 如何使用 C# 控制台应用程序做到这一点?

参数: 文件名, 用户身份, 密码, 输入

【问题讨论】:

    标签: c# http console response


    【解决方案1】:
    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;
            }
    
        }
    }
    

    【讨论】:

    • GenerateRequest 方法似乎忽略了它的 allowAutoRedirect 参数值,而总是使用 false 值?
    【解决方案2】:

    看看System.Net.WebClient类,它可以用来发出请求和处理它们的响应,以及下载文件:

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

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

    【讨论】:

      【解决方案3】:

      为此,您可以简单地使用 .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();
                  }
              }
          }
      }
      

      享受吧!

      【讨论】:

      • 谢谢。我认为您的代码用于下载,但我还需要了解将数据发布到远程服务器。
      • 我需要向服务器发送请求 XML 并读取响应。如何发送请求?我是否以某种方式将其连接到 URL?例如:站点 URL:remoteserver.com 要发送的 XML:
      【解决方案4】:
      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;
      

      希望对你有帮助

      【讨论】:

        【解决方案5】:

        Insted 使用 System.Net.WebClient 我建议看看 System.Net.Http.HttpClient,它是在 net 4.5 中引入的,它让你的生活更轻松。

        另外微软推荐在这篇文章中使用 HttpClient

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

        一个例子可能如下所示:

        var client = new HttpClient();
        var content = new MultipartFormDataContent
        {
             { new StringContent("myUserId"), "userid"},
             { new StringContent("myFileName"), "filename"},
             { new StringContent("myPassword"), "password"},
             { new StringContent("myType"), "type"}
        };
        
        var responseMessage = await client.PostAsync("some url", content);        
        var stream = await responseMessage.Content.ReadAsStreamAsync();
        

        【讨论】:

        • 很好的答案,但它缺乏一个有价值的例子。也许添加一个代码 sn-p 显示你将如何做到这一点,但 HttpClient?
        • @Prolog 刚刚加了一个例子
        猜你喜欢
        • 1970-01-01
        • 2012-06-10
        • 2013-09-29
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 2021-10-03
        • 2015-06-10
        • 1970-01-01
        相关资源
        最近更新 更多