HttpWebRequest.GetResponse() keeps getting timed out

前端 未结 5 2092
悲哀的现实
悲哀的现实 2020-12-17 09:16

i wrote a simple C# function to retrieve trade history from MtGox with following API call:

https://data.mtgox.com/api/1/BTCUSD/trades?since=
         


        
5条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-17 09:49

    This is not a solution, but just an alternative: These days i almost only use WebClient instead of HttpWebRequest. Especially WebClient.UploadString for POST and PUT and WebClient.DownloadString. These simply take and return strings. This way i don't have to deal with streams objects, except when i get a WebException. i can also set the content type with WebClient.Headers["Content-type"] if necessary. The using statement also makes life easier by calling Dispose for me.

    Rarely for performance, i set System.Net.ServicePointManager.DefaultConnectionLimit high and instead use HttpClient with it's Async methods for simultaneous calls.

    This is how i would do it now

    string GetTradesOnline(Int64 tid)
    {
        using (var wc = new WebClient())
        {
            return wc.DownloadString("https://data.mtgox.com/api/1/BTCUSD/trades?since=" + tid.ToString());
        }
    }
    

    2 more POST examples

    // POST
    string SubmitData(string data)
    {
        string response;
        using (var wc = new WebClient())
        {
            wc.Headers["Content-type"] = "text/plain";
            response = wc.UploadString("https://data.mtgox.com/api/1/BTCUSD/trades", "POST", data);
        }
    
        return response;
    }
    
    // POST: easily url encode multiple parameters
    string SubmitForm(string project, string subject, string sender, string message)
    {
        // url encoded query
        NameValueCollection query = HttpUtility.ParseQueryString(string.Empty);
        query.Add("project", project);
        query.Add("subject", subject);
    
        // url encoded data
        NameValueCollection data = HttpUtility.ParseQueryString(string.Empty);
        data.Add("sender", sender);
        data.Add("message", message);
    
        string response;
        using (var wc = new WebClient())
        {
            wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            response = wc.UploadString( "https://data.mtgox.com/api/1/BTCUSD/trades?"+query.ToString()
                                      , WebRequestMethods.Http.Post
                                      , data.ToString()
                                      );
        }
    
        return response;
    }
    

    Error handling

    try
    {
        Console.WriteLine(GetTradesOnline(0));
    
        string data = File.ReadAllText(@"C:\mydata.txt");
        Console.WriteLine(SubmitData(data));
    
        Console.WriteLine(SubmitForm("The Big Project", "Progress", "John Smith", "almost done"));
    }
    catch (WebException ex)
    {
        string msg;
        if (ex.Response != null)
        {
            // read response HTTP body
            using (var sr = new StreamReader(ex.Response.GetResponseStream())) msg = sr.ReadToEnd();
        }
        else
        {
            msg = ex.Message;
        }
    
        Log(msg);
        throw; // re-throw without changing the stack trace
    }
    

提交回复
热议问题