【问题标题】:Posting to a form results in an AggregateException发布到表单会导致 AggregateException
【发布时间】:2018-03-05 08:39:29
【问题描述】:

所以我尝试使用 HttpClient(和 CloudFlareUtilities)发布表单,并如下所示对其进行初始化:

var handler = new ClearanceHandler {
    MaxRetries = 4,
};
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Connection.Clear();
client.DefaultRequestHeaders.ConnectionClose = false;
client.DefaultRequestHeaders.Add("User-Agent",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
    "(KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36");
client.Timeout = TimeSpan.FromSeconds(30);

创建客户端成功,没有出现明显问题。但是,我创建了一个如下所示的 POST 请求:

var content = new FormUrlEncodedContent(new[] {
    new KeyValuePair<string, string>("login", "username"),
    new KeyValuePair<string, string>("password", "pw"),
    new KeyValuePair<string, string>("cookie_check", "1"),
    new KeyValuePair<string, string>("redirect", "myRedirect"),
    new KeyValuePair<string, string>("register", "0"),
    new KeyValuePair<string, string>("remember", "1")
});

并发布数据:

var post = client.PostAsync("https://www.mc-market.org/login/login", content).Result.Content.ReadAsStreamAsync().Result;

上述行抛出错误:

内部异常 1: HttpRequestException:将内容复制到流时出错。

内部异常 2: IOException: 读操作失败,见内部异常。

内部异常 3: WinHttpException: 操作已被取消

我可以从这里解释是出了点问题,并且取消了任务,但我自己从来没有取消它。

将错误行限制为

var post = client.PostAsync("https://www.mc-market.org/login/login", content);

给出同样的错误。

我是否可能错误地创建了内容?对我可能去了哪里的一些迹象表示赞赏。

【问题讨论】:

    标签: c# http-post dotnet-httpclient


    【解决方案1】:

    为简单起见,我决定不使用HttpClient。

    相反,我选择使用 PhantomJS 和 Selenium,它本身就支持浏览器内的 Javascript(我决定启用它以绕过 Cloudflare)。

    然后我使用它的SendKeys() 方法在网站https://www.mc-market.org/login/(而不是https://www.mc-market.org/login/login)中输入登录字段,然后按下带有Click() 的按钮。下面是一个例子;

    driver.FindElementById("ctrl_pageLogin_login").SendKeys("NAME");
    driver.FindElementById("ctrl_pageLogin_password").SendKeys("PASS");
    driver.FindElementById("ctrl_pageLogin_remember").Click();
    driver.FindElementByCssSelector("input.button.primary").Click();
    

    结果要简单得多,而且效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多