2

だから私はを使用して基本的なスタックオーバーフロークライアントを作成しようとしていますWebClient。プログラムをそのまま実行すると、スリープして待機していても、空の文字列の結果が得られます。ただし、Fiddler2を開くと、プログラムは機能します...必要なのはFiddlerを開くことだけです...関連するコードは次のとおりです。

public partial class MainWindow : Window
{
    public  ObservableCollection<question>  questions { get; set; }

    public MainWindow() 
    {
        questions = new ObservableCollection<question>();
        this.DataContext = this;

        InitializeComponent();
    }

    void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        MessageBox.Show(e.Result); //Right here is the difference. When 

        <BREAK POINT HERE OR IT BREAKS>

        string data = data = e.Result.Substring(e.Result.IndexOf("class=\"question-summary narrow\"") + 31);
        string content = data.Substring(0, data.IndexOf("class=\"question-summary narrow\""));
        string v, a, t, b, tgs, link;
        questions.Add(new question
            {
                //votes = v,
                //answers = a,
                //title = t.ToUpper(),
                //body = b,
                ////tags = tgs
                //href = link
             });
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        WebClient wc = new WebClient();
        wc.DownloadStringAsync(new Uri(@"http://api.stackoverflow.com/1.1/questions"));
        wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
    }
}
public class question
{
    public string votes { get; set; }
    public string answers { get; set; }
    public string title { get; set; }
    public string body { get; set; }
    public string tags { get; set; }
    public string href { get; set; }
}

また、ブラウザにhttp://api.stackoverflow.com/1.1/questionsをロードすると、フィドラーの結果が表示されます。

GET http://api.stackoverflow.com/1.1/questions 200 OK(application / json)

GET http://api.stackoverflow.com/favicon.ico 503 Service Unavailable(text / html)

これだけが表示されますが、プログラムにロードすると

GET http://api.stackoverflow.com/1.1/questions 200 OK(application / json)

4

1 に答える 1

4

問題はAPI自体にあるようです。GZippedコンテンツを受け入れると言っているわけではありませんが、とにかくGZippingであり、Fiddlerがそれを処理して解凍しているようです。アプリでは、コンテンツを解凍してこれに対処する必要があります。これを行う方法の簡単な例を次に示します。

var wc = new WebClient();
var bytes = wc.DownloadData(new Uri(@"http://api.stackoverflow.com/1.1/questions"));
string responseText;
using (var outputStream = new MemoryStream())
{
    using (var memoryStream = new MemoryStream(bytes))
    {
        using (var gzip = new GZipStream(memoryStream, CompressionMode.Decompress))
        {
            byte[] buffer = new byte[1024];
            int numBytes;
            while ((numBytes = gzip.Read(buffer, 0, buffer.Length)) > 0)
            {
                outputStream.Write(buffer, 0, numBytes);
            }
        }
        responseText = Encoding.UTF8.GetString(outputStream.ToArray());
    }
}

Console.WriteLine(responseText);

常にGZippedになるかどうかはわかりませんが、Content-Encoding HTTPヘッダーをチェックして、そうであるかどうかを確認し、gzipそうである場合はこのコードを実行し、そうでない場合は、バイトを直接テキストに変換できます。

于 2013-03-08T20:42:06.103 に答える