开机自检请求时出现随机 408 错误

本文关键字:随机 错误 请求 开机自检 | 更新日期: 2023-09-27 17:56:56

>我正在尝试向 C# 中的网站发送 POST 请求,然后解析响应中的 html 以从中获取某些项目名称。 但是,我在运行该程序的大约 408% 的时间收到 50% 的错误。 这是我的代码(大部分取自这里: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.Net.WebException"的未处理异常.dll

其他信息:远程服务器返回错误:(408) 请求超时。

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

开机自检请求时出现随机 408 错误

每当我听到"某某网络问题在一段时间后发生"时,我都会查看代码并查看using块是否正确使用。

using块应随时使用

  1. 创建一些资源,以及
  2. 使用该资源,以及
  3. 以相同的方法完成该资源

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

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

手动使用 DisposeClose调用并不总是足够的。如果在代码中引发异常且未处理,则这些将被跳过。using块将确保清理发生,即使存在未经处理的异常也是如此。

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

request.Timeout = 60000;