如何在 C# 中发送带有表单数据的 POST

7 c#

我正在尝试制作一个程序,通过 POST 中的用户名、密码、硬件 ID 和密钥来请求我的网站。

我这里有这段代码,应该使用该表单数据向我的网站发送 POST 请求,但是当它发送时,我的网络服务器报告说它没有收到 POST 数据

try
{
    string poststring = String.Format("username={0}&password={1}&key={2}&hwid={3}", Username, Password, "272453745345934756392485764589", GetHardwareID());
    HttpWebRequest httpRequest =
(HttpWebRequest)WebRequest.Create("mywebsite");

    httpRequest.Method = "POST";
    httpRequest.ContentType = "application/x-www-form-urlencoded";

    byte[] bytedata = Encoding.UTF8.GetBytes(poststring);
    httpRequest.ContentLength = bytedata.Length;

    Stream requestStream = httpRequest.GetRequestStream();
    requestStream.Write(bytedata, 0, bytedata.Length);
    requestStream.Close();


    HttpWebResponse httpWebResponse =
    (HttpWebResponse)httpRequest.GetResponse();
    Stream responseStream = httpWebResponse.GetResponseStream();

    StringBuilder sb = new StringBuilder();

    using (StreamReader reader =
    new StreamReader(responseStream, System.Text.Encoding.UTF8))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            sb.Append(line);
        }
    }

    return sb.ToString();
}
catch (Exception Error)
{
    return Error.ToString();
}
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我,我将非常感激。

aep*_*pot 11

根据HttpWebRequest文档

我们不建议您用于HttpWebRequest新开发。相反,使用System.Net.Http.HttpClient类。

HttpClient仅包含异步 API,因为 Web 请求需要等待。在等待响应时冻结整个应用程序并不好。

因此,这里有一些异步函数来发出POST请求HttpClient并向那里发送一些数据。

首先,HttpClient单独创建,因为

HttpClient旨在每个应用程序实例化一次,而不是每次使用。

private static readonly HttpClient client = new HttpClient();
Run Code Online (Sandbox Code Playgroud)

然后实现该方法。

private async Task<string> PostHTTPRequestAsync(string url, Dictionary<string, string> data)
{
    using (HttpContent formContent = new FormUrlEncodedContent(data))
    {
        using (HttpResponseMessage response = await client.PostAsync(url, formContent).ConfigureAwait(false))
        {
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者 C# 8.0

private async Task<string> PostHTTPRequestAsync(string url, Dictionary<string, string> data)
{
    using HttpContent formContent = new FormUrlEncodedContent(data);
    using HttpResponseMessage response = await client.PostAsync(url, formContent).ConfigureAwait(false);
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

看起来比你的代码更容易,对吧?

调用者异步方法看起来像

private async Task MyMethodAsync()
{
    Dictionary<string, string> postData = new Dictionary<string, string>();
    postData.Add("message", "Hello World!");
    try
    {
        string result = await PostHTTPRequestAsync("http://example.org", postData);
        Console.WriteLine(result);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你不熟悉async/await是时候打个招呼了