【问题标题】:Troubleshooting HTTPClient asynchronous POST and reading resultsHTTPClient 异步 POST 及读取结果疑难解答
【发布时间】:2013-04-01 15:16:19
【问题描述】:

我在形成和阅读帖子字符串时遇到问题。问题是他们逃脱了,但需要做得如此复杂,而且速度非常快。绝对完美的多线程或异步。非常感谢您的帮助。 这是我的代码。

private static void AsyncDown()
    {
        const string url = "http://whois.sk-nic.sk/index.jsp";
        const string req = "PREM-0001";
        var client = new HttpClient();

        var pairs = new List<KeyValuePair<string, string>>
        {
            new KeyValuePair<string, string>("text", "PREM-0001")
        };

        FormUrlEncodedContent content = new FormUrlEncodedContent(pairs);

        HttpResponseMessage response = client.PostAsync("http://whois.sk-nic.sk/index.jsp", content).Result;

        if (response.IsSuccessStatusCode)
        {

            HttpContent stream = response.Content;
            Task<string> data = stream.ReadAsStringAsync();
        }
    }

【问题讨论】:

  • 很难理解你在问什么。您可以尝试用您的母语写下您的问题,然后使用 Google 翻译将其转换为英语。
  • @nørdic 我不确定实际的问题或问题是什么。你能为我们澄清一下吗?你试过提琴手吗?
  • 您是否在询问如何读取这些请求的响应?你遇到的麻烦是你不确定如何处理它的异步部分吗?您发布的代码似乎表明
  • 谢谢。我的问题是存在whois.sk-nic.sk/index.jsp 页面,您在指定域所有者标识符“PREM-0001”后输入文本框这是一个示例并返回与他相关的数据。这些数据需要解析并存储在建筑物内的数据库中。没有数字会请求数十万。 whois.sk-nic.sk 的优势是网站速度非常快。并且可以处理一些这样的requestov。无需尽快从那里获取数据。无法发送url参数。

标签: c# post asynchronous httpwebrequest webclient


【解决方案1】:

在黑暗中粗略了解您的问题是什么,我猜您在阅读电话回复时遇到了麻烦。

当内容被POST到服务器时,

HttpResponseMessage response 
    = client.PostAsync("http://whois.sk-nic.sk/index.jsp", content).Result;

    if (response.IsSuccessStatusCode)
    {

        HttpContent stream = response.Content;
        Task<string> data = stream.ReadAsStringAsync();
    } 

它是异步执行的,因此代码将继续执行,即使结果(很可能)还不可用。因此,检查 response.IsSuccessStatusCode 不会给您预期的行为。

通过添加 await 关键字将您的调用更改为如下所示:

HttpResponseMessage response 
    = await client.PostAsync("http://whois.sk-nic.sk/index.jsp", content);

然后,将流的读取更改为也使用 await:

    if (response.IsSuccessStatusCode)
    {
        var data = await response.Content.ReadAsStringAsync();
    }

编辑:混淆了一些等待对象并更正了代码清单。

edit 2:这是我用来从给定 URL 成功下载 HTML 页面的完整 LINQPad 脚本。

var client = new HttpClient();

var pairs = new List<KeyValuePair<string, string>>
{
    new KeyValuePair<string, string>("text", "PREM-0001")
};

FormUrlEncodedContent content = new FormUrlEncodedContent(pairs);
HttpResponseMessage response = await client.PostAsync("http://whois.sk-nic.sk/index.jsp", content);

if (response.IsSuccessStatusCode)
{
    var data = await response.Content.ReadAsStringAsync();
    //data.Dump(); //uncomment previous if using LINQPad
}

【讨论】:

  • 谢谢。但如果我尝试添加等待,这是 HttpResponseMessage 的错误消息。错误“无法等待'System.Net.Http.HttpResponseMessage”
  • 是的,我忘了这是阅读您等待的内容 - 请参阅更新的代码。
  • 它不是那样工作的。不要来这部分。 "等待响应.Content.ReadAsStringAsync();"
  • 如果它没有到达那部分,那么response.IsSuccessStatusCode == false。这可能意味着一系列不同的想法
  • 还有其他方法可以达到我的需要吗?
【解决方案2】:

也许该站点自上次发布以来已更改,但现在请求参数名称是 whois 而不是文本。如果一年前也是这种情况,那就是它不起作用的原因。

今天网站也回复了get,即http://whois.sk-nic.sk/index.jsp?whois=PREM-0001

完整的代码:

private async Task<string> Get(string code)
{
    using (var client = new HttpClient())
    {
        var requestUri = String.Format("http://whois.sk-nic.sk/index.jsp?whois={0}", code);

        var data = await client.GetStringAsync(requestUri);

        return data;
    }
}

带帖子的完整代码:

private async Task<string> Post()
{
    using (var client = new HttpClient())
    {
        var postData = new KeyValuePair<string, string>[]
        {
            new KeyValuePair<string, string>("whois", "PREM-0001"),
        };

        var content = new FormUrlEncodedContent(postData);

        var response = await client.PostAsync("http://whois.sk-nic.sk/index.jsp", content);

        if (!response.IsSuccessStatusCode)
        {
            var message = String.Format("Server returned HTTP error {0}: {1}.", (int)response.StatusCode, response.ReasonPhrase);
            throw new InvalidOperationException(message);
        }

        var data = await response.Content.ReadAsStringAsync();

        return data;
    }
}

或者可以使用解析器,因为我猜提取返回值是最终目标:

private void HtmlAgilityPack(string code)
{
    var requestUri = String.Format("http://whois.sk-nic.sk/index.jsp?whois={0}", code);

    var request = new HtmlWeb();

    var htmlDocument = request.Load(requestUri);

    var name = htmlDocument.DocumentNode.SelectSingleNode("/html/body/table[1]/tr[5]/td/table/tr[2]/td[2]").InnerText.Trim();
    var organizations = htmlDocument.DocumentNode.SelectSingleNode("/html/body/table[1]/tr[5]/td/table/tr[3]/td[2]").InnerText.Trim();
}

【讨论】:

    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2018-09-06
    • 2014-08-29
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多