POST 请求出现随机 408 错误

Posted

技术标签:

【中文标题】POST 请求出现随机 408 错误【英文标题】:Random 408 error on POST request 【发布时间】:2015-09-04 16:53:36 【问题描述】:

我正在尝试向 C# 中的网站发送 POST 请求,然后解析响应中的 html 以从中获取某些项目名称。但是,在我运行程序的大约 50% 的时间里,我会收到 408 错误。这是我的代码(大部分来自这里:https://msdn.microsoft.com/en-us/library/debx8sh9.aspx):

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Collections.Generic;
using HtmlAgilityPack;
using System.Net;
using System.Diagnostics;
using Newtonsoft.Json.Linq;
using System.Linq;
using Fizzler.Systems.HtmlAgilityPack;

class FinderClass

    //some irrelevant code here

    public int getItemIndex(string itemName)
    
        itemName = itemName.Replace(" ", "+");      //formatting for request
        itemName = itemName.Replace("|", "%7C");


        //taken from https://msdn.microsoft.com/en-us/library/debx8sh9(v=vs.110).aspx :

        WebRequest request = WebRequest.Create("http://csgolounge.com/ajax/tradeCsRightTmp.php");   //address to send request
        request.Method = "POST";
        string postData = "type=Type+-+All&quality=0&exterior=0&fraze=" + itemName + "&search=1&page=1";    //request parameters
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = byteArray.Length;

        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        WebResponse response = request.GetResponse();
        Debug.WriteLine(((HttpWebResponse)response).StatusDescription);
        dataStream = response.GetResponseStream();

        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        Debug.WriteLine(responseFromServer);    //print response to debug console (temporary)

        reader.Close();
        dataStream.Close();
        response.Close();

        return -1;      //placeholder for when item index is parsed from html and returned
    

抛出的异常:

System.dll 中出现“System.Net.WebException”类型的未处理异常

附加信息:远程服务器返回错误:(408) Request Timeout。

通常我会认为有一个简单的解决方案,但由于它只发生在我运行程序的一半时间,它可能会更复杂。

【问题讨论】:

从 Internet 复制代码时要小心,即使是从 MSDN 复制代码。它是为了说明作者想要说明的内容,而不是作为一个好的、专业的代码的例子。在您发布的代码中,StreamWebResponseStreamReader 都需要在 using 块中。试试看它是否能解决问题。您可能会用完资源,因为您没有在所有情况下都进行清理(例如,如果抛出异常)。 检查这个问题,可能和你的问题有关***.com/questions/1667720/http-408-request-timeout @JohnSaunders 我的代码开头有using 语句,如果这就是你的意思,但除此之外我不确定我是否真的理解你在说什么(对不起,我C# 新手)。 见“using Statement”。 @JohnSaunders 谢谢,效果很好。 【参考方案1】:

每当我听到“这样的网络问题在一段时间后发生”时,我倾向于查看代码并查看using 块是否被正确使用。

using 任何时候都应该使用块

    创建一些资源,然后 使用该资源,然后 以相同的方法完成该资源

(还有一些其他的时间,但这是最常见的情况)

在你的代码中,你正在创建一个WebResponse、一个Stream和一个StreamReader,你正在使用它们,然后你正在完成它们,你没有清理.

手动使用DisposeClose 调用并不总是足够的。如果在代码中抛出异常并且未处理,这些将被跳过。 using 块将确保进行清理,即使存在未处理的异常

【讨论】:

【参考方案2】:

此错误是由于超时造成的。从表面上看,似乎服务器正在超时。所以,我会调查服务器端,看看通话需要多长时间。但是,它有可能只是客户端问题,因为当我在客户端暂停调试器时有时会收到此错误。 IE。请求被发送到服务器,服务器发回响应,但客户端不接受它。我知道这听起来很有趣,而且我自己也无法弄清楚为什么会发生这种情况。无论如何,您可以尝试在客户端的 WebRequest 中将超时设置为更大的值:

request.Timeout = 60000;

【讨论】:

以上是关于POST 请求出现随机 408 错误的主要内容,如果未能解决你的问题,请参考以下文章

空 HTTP POST 请求或 GET 请求通过 HTTP API 生成随机值

POST 的标头和正文之间的随机延迟

CORS 随机阻塞请求

随机“未指定应用程序加密密钥”

为啥http post响应在响应末尾添加随机字符

如何修复来自 Axios 的随机 http 请求(404 响应)