jestrange
jestrange

Reputation: 271

How to fetch data (partial) from continuously responding webpage with c#?

We have this URL with a connection that does not close and continues to send response indefinitely every seconds or so.

I wanted to fetch the partial data but with my current code, it waits for the connection to conclude or close before showing the data but since this webpage responds indefinitely, the program I've written waits indefinitely as well.

But with other test URL such as www.google.com which closes the connection immediately, it works fine.

Here is my code:

public partial class Form2 : Form
{
    string testurl = "https://live.wh.sportingpulseinternational.com/v1/basketball/read/448426?ak=6eea426648c256cae71a9409352304fe&types=scoreboard,status,boxscore&format=json";

    WebClient wc = new WebClient();
    public Form2()
    {
        InitializeComponent();

        wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(DownloadComplete);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        wc.DownloadDataAsync(new Uri(testurl));
        button1.Enabled = false;
    }

    private void DownloadComplete(object sender, DownloadDataCompletedEventArgs args)
    {
        byte[] result = args.Result;
        richTextBox1.Text += System.Text.Encoding.Default.GetString(result);
        button1.Enabled = true;
    }
}

If you have further clarification, please do ask.

ANSWER UPDATE Thanks to levent, what I did is like this.

Here is the complete answer to my problem:

    string testurl = "https://live.wh.sportingpulseinternational.com/v1/basketball/read/448426?ak=6eea426648c256cae71a9409352304fe&types=scoreboard,status,boxscore&format=json";
    BackgroundWorker worker = new BackgroundWorker();

    public Form2()
    {
        InitializeComponent();

        worker.WorkerSupportsCancellation = true;
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        SetEnabled(button1, false);
        worker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        string url = testurl;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        using (WebResponse response = request.GetResponse())
        {
            using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
            {
                try
                {
                    while (!rdr.EndOfStream)
                    {
                        var str = rdr.ReadLine();
                        SetText(richTextBox1, str);
                    }
                }
                catch (Exception)
                {

                }
            }
        }
        worker.CancelAsync();
        SetEnabled(button1, true);
    }

    delegate void SetEnabledCallback(Button target, bool value);
    private void SetEnabled(Button target, bool value)
    {
        if (target.InvokeRequired)
        {
            SetEnabledCallback d = new SetEnabledCallback(SetEnabled);
            this.Invoke(d, new object[] { target, value });
        }
        else
        {
            target.Enabled = value;
        }
    }

    delegate void SetTextCallback(dynamic target, string text);
    private void SetText(dynamic target, string text)
    {
        if (target.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.Invoke(d, new object[] { target, text });
        }
        else
        {
            target.Text += text;
        }
    }

Upvotes: 0

Views: 221

Answers (1)

levent
levent

Reputation: 3634

this code read messages, you can run it in asycn operation.

         string url = "https://live.wh.sportingpulseinternational.com/v1/basketball/read/448426?ak=6eea426648c256cae71a9409352304fe&types=scoreboard,status,boxscore&format=json%22link%22";
         HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
         using(WebResponse response =  request.GetResponse())
         {
             using(StreamReader rdr = new StreamReader(response.GetResponseStream())){
                 while(!rdr.EndOfStream){
                     var str = rdr.ReadLine();
                     Console.WriteLine(str);
                 }
             }
         }

Upvotes: 1

Related Questions