POST请求中的随机408错误

时间:2015-06-18 21:00:52

标签: c# asp.net post http-status-code-408

我尝试向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.Net.WebException'发生在System.dll

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

通常情况下,我认为有一个直接的解决方案,但由于它只发生了一半的时间我运行程序,它可能会更复杂。

2 个答案:

答案 0 :(得分:0)

任何时候我都会听到" 所以这样的网络问题会在一段时间后发生,我倾向于查看代码,看看是否有using块使用得当。

时应该使用

using

  1. 创建一些资源,
  2. 使用该资源,
  3. 以相同的方法使用该资源完成
  4. (还有一些其他时间,但这是最常见的情况)

    在您的代码中,您正在创建WebResponseStreamStreamReader,您正在使用它们,然后您要完成它们,并且你没有清理

    手动使用DisposeClose来电并不足够。如果代码中抛出异常并且未处理,则会跳过这些。 using块将确保清理发生,即使存在未处理的异常

答案 1 :(得分:0)

此错误是由于超时。从表面上看,它看起来好像服务器正在超时。所以,我会调查服务器端以查看呼叫的持续时间。但是,它有可能只是客户端问题,因为我在客户端暂停调试器时有时会出现此错误。即将请求发送到服务器,服务器发回响应,但客户端不接受它。我知道这听起来很有趣,但我无法弄清楚为什么会发生这种情况。无论如何,您可以尝试在客户端的WebRequest中将超时设置为更大的值:

request.Timeout = 60000;