답변
HTTP GET및 POST요청 을 수행하는 몇 가지 방법이 있습니다 .
방법 A : HttpClient (권장)
가능 : .NET Framework 4.5+, .NET Standard 1.1+, .NET Core 1.0+.
현재 선호되는 방식이며 비동기식 및 고성능입니다. 대부분의 경우 내장 버전을 사용하지만 아주 오래된 플랫폼에는 NuGet 패키지가 있습니다.
using System.Net.Http;
설정
HttpClient특별한 이유가없는 한 응용 프로그램 수명 동안 인스턴스를 생성 하고 공유하는 것이 좋습니다 .
private static readonly HttpClient client = new HttpClient();
참조 HttpClientFactoryA에 대한 의존성 주입 솔루션입니다.
- 
POSTvar values = new Dictionary<string, string> { { "thing1", "hello" }, { "thing2", "world" } }; var content = new FormUrlEncodedContent(values); var response = await client.PostAsync("http://www.example.com/recepticle.aspx", content); var responseString = await response.Content.ReadAsStringAsync(); - 
GETvar responseString = await client.GetStringAsync("http://www.example.com/recepticle.aspx"); 
방법 B : 타사 라이브러리
- 
POSTvar client = new RestClient("http://example.com"); // client.Authenticator = new HttpBasicAuthenticator(username, password); var request = new RestRequest("resource/{id}"); request.AddParameter("thing1", "Hello"); request.AddParameter("thing2", "world"); request.AddHeader("header", "value"); request.AddFile("file", path); var response = client.Post(request); var content = response.Content; // Raw content as string var response2 = client.Post<Person>(request); var name = response2.Data.Name; 
유창한 API를 사용하고, 도우미를 테스트하고, HttpClient를 사용하며, 이식성이 뛰어난 최신 라이브러리입니다. NuGet을 통해 사용할 수 있습니다 .
    using Flurl.Http;
- 
POSTvar responseString = await "http://www.example.com/recepticle.aspx" .PostUrlEncodedAsync(new { thing1 = "hello", thing2 = "world" }) .ReceiveString(); - 
GETvar responseString = await "http://www.example.com/recepticle.aspx" .GetStringAsync(); 
방법 C : HttpWebRequest (새 작업에는 권장되지 않음)
가능 : .NET Framework 1.1+, .NET Standard 2.0+, .NET Core 1.0+. .NET Core에서는 대부분 호환성을 위해 랩핑 HttpClient하고 성능이 떨어지며 새로운 기능을 얻지 못합니다.
using System.Net;
using System.Text;  // For class Encoding
using System.IO;    // For StreamReader
- 
POSTvar request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx"); var postData = "thing1=" + Uri.EscapeDataString("hello"); postData += "&thing2=" + Uri.EscapeDataString("world"); var data = Encoding.ASCII.GetBytes(postData); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = data.Length; using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); - 
GETvar request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx"); var response = (HttpWebResponse)request.GetResponse(); var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
방법 D : WebClient (새 작업에 권장되지 않음)
이 래퍼 HttpWebRequest입니다. 와 비교하십시오HttpClient .
가능 : .NET Framework 1.1+, NET Standard 2.0+,.NET Core 2.0+
using System.Net;
using System.Collections.Specialized;
- 
POSTusing (var client = new WebClient()) { var values = new NameValueCollection(); values["thing1"] = "hello"; values["thing2"] = "world"; var response = client.UploadValues("http://www.example.com/recepticle.aspx", values); var responseString = Encoding.Default.GetString(response); } - 
GETusing (var client = new WebClient()) { var responseString = client.DownloadString("http://www.example.com/recepticle.aspx"); } 
답변
간단한 GET 요청
using System.Net;
...
using (var wb = new WebClient())
{
    var response = wb.DownloadString(url);
}
간단한 POST 요청
using System.Net;
using System.Collections.Specialized;
...
using (var wb = new WebClient())
{
    var data = new NameValueCollection();
    data["username"] = "myUser";
    data["password"] = "myPassword";
    var response = wb.UploadValues(url, "POST", data);
    string responseInString = Encoding.UTF8.GetString(response);
}
답변
MSDN 에는 샘플이 있습니다.
using System;
using System.IO;
using System.Net;
using System.Text;
namespace Examples.System.Net
{
    public class WebRequestPostExample
    {
        public static void Main()
        {
            // Create a request using a URL that can receive a post. 
            WebRequest request = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx");
            // Set the Method property of the request to POST.
            request.Method = "POST";
            // Create POST data and convert it to a byte array.
            string postData = "This is a test that posts this string to a Web server.";
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            // 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();
            // Get the response.
            WebResponse response = request.GetResponse();
            // Display the status.
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            // Get the stream containing content returned by the server.
            dataStream = response.GetResponseStream();
            // Open the stream using a StreamReader for easy access.
            StreamReader reader = new StreamReader(dataStream);
            // Read the content.
            string responseFromServer = reader.ReadToEnd();
            // Display the content.
            Console.WriteLine(responseFromServer);
            // Clean up the streams.
            reader.Close();
            dataStream.Close();
            response.Close();
        }
    }
}
답변
이것은 JSON 형식으로 데이터를 송수신하는 완전한 작동 예입니다. Visual Studio 2013 Express Edition을 사용했습니다.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
namespace ConsoleApplication1
{
    class Customer
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public string Phone { get; set; }
    }
    public class Program
    {
        private static readonly HttpClient _Client = new HttpClient();
        private static JavaScriptSerializer _Serializer = new JavaScriptSerializer();
        static void Main(string[] args)
        {
            Run().Wait();
        }
        static async Task Run()
        {
            string url = "http://www.example.com/api/Customer";
            Customer cust = new Customer() { Name = "Example Customer", Address = "Some example address", Phone = "Some phone number" };
            var json = _Serializer.Serialize(cust);
            var response = await Request(HttpMethod.Post, url, json, new Dictionary<string, string>());
            string responseText = await response.Content.ReadAsStringAsync();
            List<YourCustomClassModel> serializedResult = _Serializer.Deserialize<List<YourCustomClassModel>>(responseText);
            Console.WriteLine(responseText);
            Console.ReadLine();
        }
        /// <summary>
        /// Makes an async HTTP Request
        /// </summary>
        /// <param name="pMethod">Those methods you know: GET, POST, HEAD, etc...</param>
        /// <param name="pUrl">Very predictable...</param>
        /// <param name="pJsonContent">String data to POST on the server</param>
        /// <param name="pHeaders">If you use some kind of Authorization you should use this</param>
        /// <returns></returns>
        static async Task<HttpResponseMessage> Request(HttpMethod pMethod, string pUrl, string pJsonContent, Dictionary<string, string> pHeaders)
        {
            var httpRequestMessage = new HttpRequestMessage();
            httpRequestMessage.Method = pMethod;
            httpRequestMessage.RequestUri = new Uri(pUrl);
            foreach (var head in pHeaders)
            {
                httpRequestMessage.Headers.Add(head.Key, head.Value);
            }
            switch (pMethod.Method)
            {
                case "POST":
                    HttpContent httpContent = new StringContent(pJsonContent, Encoding.UTF8, "application/json");
                    httpRequestMessage.Content = httpContent;
                    break;
            }
            return await _Client.SendAsync(httpRequestMessage);
        }
    }
}
답변
여기에 정말 좋은 답변이 있습니다. WebClient ()를 사용하여 헤더를 설정하는 다른 방법을 게시하겠습니다. 또한 API 키를 설정하는 방법을 보여줄 것입니다.
        var client = new WebClient();
        string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(userName + ":" + passWord));
        client.Headers[HttpRequestHeader.Authorization] = $"Basic {credentials}";
        //If you have your data stored in an object serialize it into json to pass to the webclient with Newtonsoft's JsonConvert
        var encodedJson = JsonConvert.SerializeObject(newAccount);
        client.Headers.Add($"x-api-key:{ApiKey}");
        client.Headers.Add("Content-Type:application/json");
        try
        {
            var response = client.UploadString($"{apiurl}", encodedJson);
            //if you have a model to deserialize the json into Newtonsoft will help bind the data to the model, this is an extremely useful trick for GET calls when you have a lot of data, you can strongly type a model and dump it into an instance of that class.
            Response response1 = JsonConvert.DeserializeObject<Response>(response);
답변
이 솔루션은 표준 .NET 호출 만 사용합니다.
테스트 :
- 엔터프라이즈 WPF 응용 프로그램에서 사용 중입니다. UI 차단을 피하기 위해 async / await를 사용합니다.
 - .NET 4.5 이상과 호환됩니다.
 - 매개 변수없이 테스트되었습니다 (장면 뒤에 “GET”필요).
 - 매개 변수로 테스트했습니다 (장면 뒤의 “POST”필요).
 - Google과 같은 표준 웹 페이지에서 테스트했습니다.
 - 내부 Java 기반 웹 서비스로 테스트되었습니다.
 
참고:
// Add a Reference to the assembly System.Web
암호:
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
private async Task<WebResponse> CallUri(string url, TimeSpan timeout)
{
    var uri = new Uri(url);
    NameValueCollection rawParameters = HttpUtility.ParseQueryString(uri.Query);
    var parameters = new Dictionary<string, string>();
    foreach (string p in rawParameters.Keys)
    {
        parameters[p] = rawParameters[p];
    }
    var client = new HttpClient { Timeout = timeout };
    HttpResponseMessage response;
    if (parameters.Count == 0)
    {
        response = await client.GetAsync(url);
    }
    else
    {
        var content = new FormUrlEncodedContent(parameters);
        string urlMinusParameters = uri.OriginalString.Split('?')[0]; // Parameters always follow the '?' symbol.
        response = await client.PostAsync(urlMinusParameters, content);
    }
    var responseString = await response.Content.ReadAsStringAsync();
    return new WebResponse(response.StatusCode, responseString);
}
private class WebResponse
{
    public WebResponse(HttpStatusCode httpStatusCode, string response)
    {
        this.HttpStatusCode = httpStatusCode;
        this.Response = response;
    }
    public HttpStatusCode HttpStatusCode { get; }
    public string Response { get; }
}
매개 변수없이 호출하려면 (장면 뒤에 “GET”사용) :
 var timeout = TimeSpan.FromSeconds(300);
 WebResponse response = await this.CallUri("http://www.google.com/", timeout);
 if (response.HttpStatusCode == HttpStatusCode.OK)
 {
     Console.Write(response.Response); // Print HTML.
 }
매개 변수를 사용하여 호출하려면 (장면 뒤에 “POST”를 사용) :
 var timeout = TimeSpan.FromSeconds(300);
 WebResponse response = await this.CallUri("http://example.com/path/to/page?name=ferret&color=purple", timeout);
 if (response.HttpStatusCode == HttpStatusCode.OK)
 {
     Console.Write(response.Response); // Print HTML.
 }
답변
지금까지 찾은 간단한 (한 줄짜리, 오류 확인, 응답 대기 없음) 솔루션 :
(new WebClient()).UploadStringAsync(new Uri(Address), dataString);
주의해서 사용하십시오!
