1

我需要将postAsync标题和内容放在一起。为了通过 C# 中的控制台应用程序访问网站。我将标头作为HttpHeader具有变量名称标头的对象,并将我的内容命名为newContent带有__Token,和. 现在我想要做的是将 newContent 添加到标头,然后用于发出我的 POST 请求。returnEmailPasswordpostAsync(url, header+content)

public async static void DownloadPage(string url)
{
    CookieContainer cookies = new CookieContainer();
    HttpClientHandler handler = new HttpClientHandler();
    handler.CookieContainer = cookies;

    using (HttpClient client = new HttpClient(handler))
    {
        using (HttpResponseMessage response = client.GetAsync(url).Result)
        {
            //statusCode
            CheckStatusCode(response);
            //header
            HttpHeaders headers = response.Headers;
            //content
            HttpContent content = response.Content;
            //getRequestVerificationToken&createCollection
            string newcontent = CreateCollection(content);

            using(HttpResponseMessage response2 = client.PostAsync(url,))

        }

    }
}

public static string GenerateQueryString(NameValueCollection collection)
{
    var array = (from key in collection.AllKeys
                 from value in collection.GetValues(key)
                 select string.Format("{0}={1}", WebUtility.UrlEncode(key), WebUtility.UrlEncode(value))).ToArray();
    return string.Join("&", array);
}


public static void CheckStatusCode(HttpResponseMessage response)
{
    if (response.StatusCode != HttpStatusCode.OK)
        throw new Exception(String.Format(
       "Server error (HTTP {0}: {1}).",
       response.StatusCode,
       response.ReasonPhrase));
    else
        Console.WriteLine("200");
}
public static string CreateCollection(HttpContent content)
{
    var myContent = content.ReadAsStringAsync().Result;
    HtmlNode.ElementsFlags.Remove("form");
    string html = myContent;
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);
    var input = doc.DocumentNode.SelectSingleNode("//*[@name='__Token']");
    var token = input.Attributes["value"].Value;
    //add all necessary component to collection
    NameValueCollection collection = new NameValueCollection();
    collection.Add("__Token", token);
    collection.Add("return", "");
    collection.Add("Email", "11111111@hotmail.com");
    collection.Add("Password", "1234");
    var newCollection = GenerateQueryString(collection);
    return newCollection;
}
4

3 回答 3

1

我昨天做了同样的事情。我为我的控制台应用程序创建了一个单独的类,并将 HttpClient 的东西放在那里。

在主要:

_httpCode = theClient.Post(_response, theClient.auth_bearer_token);

在课堂里:

    public long Post_RedeemVoucher(Response _response, string token)
    {
        string client_URL_voucher_redeem = "https://myurl";

        string body = "mypostBody";

        Task<Response> content = Post(null, client_URL_voucher_redeem, token, body);

        if (content.Exception == null)
        {
            return 200;
        }
        else
            return -1;
    }

然后调用本身:

    async Task<Response> Post(string headers, string URL, string token, string body)
    {
        Response _response = new Response();

        try
        {
            using (HttpClient client = new HttpClient())
            {
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, URL);
                request.Content = new StringContent(body);

                using (HttpResponseMessage response = await client.SendAsync(request))
                {
                    if (!response.IsSuccessStatusCode)
                    {
                        _response.error = response.ReasonPhrase;
                        _response.statusCode = response.StatusCode;

                        return _response;
                    }

                    _response.statusCode = response.StatusCode;
                    _response.httpCode = (long)response.StatusCode;

                    using (HttpContent content = response.Content)
                    {
                        _response.JSON = await content.ReadAsStringAsync().ConfigureAwait(false);
                        return _response;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            _response.ex = ex;
            return _response;
        }
    }

我希望这能为您指明正确的方向!

于 2016-08-05T14:27:41.260 回答
1

如何遍历您的Headers并将它们添加到Content对象中:

var content = new StringContent(requestString, Encoding.UTF8);

// Iterate over current headers, as you can't set `Headers` property, only `.Add()` to the object.
foreach (var header in httpHeaders) { 
    content.Headers.Add(header.Key, header.Value.ToString());
}

response = client.PostAsync(Url, content).Result;

现在,它们以一种方法发送。

于 2016-08-05T14:29:44.250 回答
0

如果您仍在研究此问题,您还可以在请求级别和级别添加标头HttpClient。这对我有用:

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, URL);

request.Content = new StringContent(body);

request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
于 2016-08-08T13:03:03.447 回答