sheldon90
sheldon90

Reputation: 115

webclient I/O error while sending multiple request to API

I want to make Twitter Sentiment Analysis Windows Phone Application.

the application works by retrieving all the related tweets based on what query terms that users entered. for example, if I enter "Windows Phone" in input search box, the results will show all the tweet that contains "windows phone" terms.

here's the code (that I get from Arik Poznanski's Blog)

    /// <summary>
    /// Searches the specified search text.
    /// </summary>
    /// <param name="searchText">The search text.</param>
    /// <param name="onSearchCompleted">The on search completed.</param>
    /// <param name="onError">The on error.</param>
    public static void Search(string searchText, Action<IEnumerable<Twit>> onSearchCompleted = null, Action<Exception> onError = null, Action onFinally = null)
    {
        WebClient webClient = new WebClient();

        // register on download complete event
        webClient.OpenReadCompleted += delegate(object sender, OpenReadCompletedEventArgs e)
        {
            try
            {
                // report error
                if (e.Error != null)
                {
                    if (onError != null)
                    {
                        onError(e.Error);
                    }
                    return;
                }

                // convert json result to model
                Stream stream = e.Result;
                DataContractJsonSerializer dataContractJsonSerializer = new DataContractJsonSerializer(typeof(TwitterResults));
                TwitterResults twitterResults = (TwitterResults)dataContractJsonSerializer.ReadObject(stream);

                App thisApp = Application.Current as App;
                thisApp.klasifikasi = new Klasifikasi();

                foreach (Twit Tweet in twitterResults.results)
                {
                    try
                    {
                        thisApp.klasifikasi.UploadData(Tweet); //requesting 
                        break;
                    }
                    finally
                    {
                        // notify finally callback
                        if (onFinally != null)
                        {
                            onFinally();
                        }
                    }
                }
                //thisApp.klasifikasi.UploadDatas(twitterResults.results);
                //thisApp.PositiveTweetModel = new PositiveTweetModel("Positive", twitterResults.results);

                // notify completed callback
                if (onSearchCompleted != null)
                {
                    onSearchCompleted(twitterResults.results);

                   /// Divide the list here

                }
            }
            finally
            {
                // notify finally callback
                if (onFinally != null)
                {
                    onFinally();
                }
            }
        };

        string encodedSearchText = HttpUtility.UrlEncode(searchText);
        webClient.OpenReadAsync(new Uri(string.Format(TwitterSearchQuery, encodedSearchText)));
    }

and to call the method

           TwitterService.Search(
            text,
           (items) => { PositiveList.ItemsSource = items; },
           (exception) => { MessageBox.Show(exception.Message); },
           null
           );

to upload POST Data into the API

    public void UploadData(Twit tweetPerSend)
    {
        if (NetworkInterface.GetIsNetworkAvailable())
        {
            chatterbox.Headers[HttpRequestHeader.ContentType] = "application/x-www-                       form-urlencoded";
            chatterbox.Headers["X-Mashape-Authorization"] = "MXBxYmptdjhlbzVnanJnYndicXNpN2NwdWlvMWE1OjA0YTljMWJjMDg4MzVkYWY2YmIzMzczZWFkNDlmYWRkNDYzNGU5NmI=";

            var Uri = new Uri("https://chatterboxco-sentiment-analysis-for-social-media---nokia.p.mashape.com/sentiment/current/classify_text/");

            StringBuilder postData = new StringBuilder();
            postData.AppendFormat("{0}={1}", "lang", HttpUtility.UrlEncode("en"));
            postData.AppendFormat("&{0}={1}", "text", HttpUtility.UrlEncode(tweetPerSend.DecodedText));
            postData.AppendFormat("&{0}={1}", "exclude", HttpUtility.UrlEncode("is")); // disesuaikan 
            postData.AppendFormat("&{0}={1}", "detectlang", HttpUtility.UrlEncode("0"));
            chatterbox.UploadStringAsync(Uri, "POST", postData.ToString());
            chatterbox.UploadStringCompleted += new UploadStringCompletedEventHandler(chatterbox_UploadStringCompleted);

        }
    }


    void chatterbox_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
        var chatterbox = sender as WebClient;
        chatterbox.UploadStringCompleted -= chatterbox_UploadStringCompleted;
        string response = string.Empty;
        if (!e.Cancelled)
        {
            response = HttpUtility.UrlDecode(e.Result);
            nilaiKlasifikasi = ParsingHasil(response);
            MessageBox.Show(nilaiKlasifikasi.ToString()); //just testing
            //textBlock1.Text = response;
        }
    }

    private double ParsingHasil(String response)
    {

        var result = Regex.Match(@response, @"(?<=""value"": )(-?\d+(\.\d+)?)(?=,|$)");
        Debug.WriteLine(result);
        double hasil = Convert.ToDouble(result.ToString());
        //return Convert.ToInt32(result);
        return hasil;

    }

However, there isn't only 1 tweet to retrieve, there'll be many tweets, so the main problem is, after I retrieve all the tweet and request the result to the API, I get this error "WebClient does not support concurrent I/O operations"

Does anyone know how to solve this problem?

any help would be appreciated

Upvotes: 0

Views: 344

Answers (1)

Peter Ritchie
Peter Ritchie

Reputation: 35870

You'll have to execute UploadStringAsync synchronously one at a time. (i.e. chain execution of the next UploadStringAsync in the UploadStringCompleted handler.

Or, create a new WebClient for each UploadStringAsync.

Upvotes: 1

Related Questions