Having a strange issue with a client side code that should be sending HTTP Put request every 60 seconds to my RoR website/app.
The issues is that The client side app pushes a few request up to the website(anywhere from 2 to 9 request). Then the client side code stops sending the http put request after the few initial successful pushes.
Information: Client side app is a C# windows application. website is running RoR 3.2.
c# code to send http put
static void HttpPutRequest(string Json)
{
Logger("Sending JSON: " + Json);
try
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://miningmonitor.herokuapp.com/workers/update");
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = "PUT";
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
Logger("To URL: " + httpWebRequest.Address.ToString());
streamWriter.WriteLine(Json);
streamWriter.Flush();
streamWriter.Close();
try
{
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
var wRespStatusCode = httpResponse.StatusCode;
Logger("Website return code: " + wRespStatusCode.ToString());
}
catch (WebException we)
{
var wRespStatusCode = ((HttpWebResponse)we.Response).StatusCode;
Logger(" Exception and Website return code: " + wRespStatusCode.ToString());
}
}
}
catch (WebException we2)
{
var GetRequestStreamExp = ((HttpWebResponse)we2.Response).StatusCode;
Logger(" Exception trying to setup httpWebRequest.GetRequestStream: " + GetRequestStreamExp.ToString());
}
}
client side C# logging statements
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"5953","rejected":"152","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.63"]}
To URL: https://miningmonitor.herokuapp.com/workers/update
Website return code: OK
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"5956","rejected":"152","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.62"]}
To URL: https://miningmonitor.herokuapp.com/workers/update
Website return code: OK
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"5964","rejected":"152","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.63"]}
To URL: https://miningmonitor.herokuapp.com/workers/update
Website return code: OK
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"5970","rejected":"152","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.63"]}
To URL: https://miningmonitor.herokuapp.com/workers/update
Website return code: OK
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"5978","rejected":"152","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.63"]}
To URL: https://miningmonitor.herokuapp.com/workers/update
Website return code: OK
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"5989","rejected":"153","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.63"]}
To URL: https://miningmonitor.herokuapp.com/workers/update
Website return code: OK
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"5995","rejected":"153","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.63"]}
To URL: https://miningmonitor.herokuapp.com/workers/update
Website return code: OK
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"5999","rejected":"153","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.63","74.00","0.63"]}
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"6009","rejected":"153","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.63"]}
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"6015","rejected":"153","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.63","73.00","0.64","74.00","0.63"]}
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"6021","rejected":"153","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.63"]}
Sending JSON: {"worker_user_name":"test:worker1","hashrate":"1.91","accepted":"6029","rejected":"153","hw_errors":"0","num_gpu":"3","gpus":["72.00","0.64","73.00","0.64","74.00","0.64"]}
from that point on its only creating that json not sending it.
server logs showing put request coming through
Aug 13 10:31:52 miningmonitor heroku/router: at=info method=PUT path=/workers/update host=miningmonitor.herokuapp.com fwd="198.244.99.204" dyno=web.1 connect=8ms service=101ms status=200 bytes=2005
How I'm running this every 60 seconds is using a timer in c#. But Im just confused why the code stops entering the using statement and therefore stops sending the JSON string. You can tell this by the logging statements in the C# code. Im not really sure how the using statement works I just modified that statement from an example I found online to send http requests. So if someone could also explain the using statement that would be great.
Adding in the timer code.
public void update(string user_worker)
{
System.Timers.Timer timer = new System.Timers.Timer(60000);
timer.Elapsed += (sender, e) =>
{
//query the miner for summary and gpucount information
String SummaryQuery = QueryMiner("summary");
String gpuNum = FindKey(QueryMiner("gpucount"), "Count");
//String PoolQuery = QueryMiner("pools");
int numgpus = Convert.ToInt32(gpuNum);
//Array of strings to hold each gpu query
String[] gpuQueries = new String[numgpus];
//add the GPU queries into the array
for (int i = 0; i < numgpus; i++)
gpuQueries[i] = QueryMiner("gpu|" + i);
//now add information specific to each gpu to a list
List<string> gpuList = new List<string>();
for (int i = 0; i + 1 <= gpuQueries.Length; i++)
{
gpuList.Add(FindKey(gpuQueries[i], "Temperature"));
gpuList.Add(FindKey(gpuQueries[i], "MHS 5s"));
}
//set all the values that we have gotten from the queries
this.worker_user_name = user_worker;
this.hashrate = FindKey(SummaryQuery, "MHS av");
this.accepted = FindKey(SummaryQuery, "Accepted");
this.rejected = FindKey(SummaryQuery, "Rejected");
this.hw_errors = FindKey(SummaryQuery, "Hardware Errors");
this.num_gpu = gpuNum;
this.gpus = gpuList.ToArray();
//create JSON from the workerUpdate object
string JSON = JsonConvert.SerializeObject(this);
//send to website
HttpPutRequest(JSON);
};
timer.Start();
}
I caught the exception in the logs now. the exception is below. But not sure what it means.
Exception: System.NullReferenceException: Object reference not set to an instance of an object.
at MiningMonitorClientW.WorkerUpdate.HttpPutRequest(String Json)
at MiningMonitorClientW.WorkerUpdate.<>c__DisplayClass1.<update>b__0(Object sender, ElapsedEventArgs e)
Update: So I've done more debugging and ive noticed that when I get the error my code runs until this line
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
maybe its trying to create a streamwrite and when I am requesting Stream I'm getting a null response? Not sure. But exception is saying something is null.