1

C# で Web サイトに 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) 要求タイムアウト。

通常、これには簡単な解決策があると思いますが、プログラムを実行する時間の半分しか発生しないため、もっと複雑な問題になる可能性があります。

4

2 に答える 2

0

「しばらくするとそのようなネットワークの問題が発生する」と聞くたびに、コードを見て、usingブロックが正しく使用されているかどうかを確認する傾向があります。

usingブロックはいつでも使用する必要があります

  1. リソースを作成し、
  2. そのリソースを使用し、
  3. 同じメソッドでそのリソースを終了します

(他にもいくつかありますが、これが最も多いケースです)

あなたのコードでは、 a WebResponse、 a Stream、および aを作成し、StreamReaderそれらを使用してから、それらを仕上げており、 をクリーンアップしていません

Disposeまたは呼び出しを手動で使用するCloseだけでは、必ずしも十分ではありません。コードで例外がスローされ、処理されない場合、これらはスキップされます。ブロックは、未処理の例外が存在する場合でもusing、クリーンアップが確実に行われるようにします。

于 2015-06-18T21:59:44.910 に答える