【发布时间】:2013-08-13 20:28:23
【问题描述】:
客户端代码有一个奇怪的问题,应该每 60 秒向我的 RoR 网站/应用发送 HTTP Put 请求。
问题是客户端应用程序将一些请求推送到网站(从 2 到 9 请求)。然后客户端代码在几次初始成功推送后停止发送 http put 请求。
信息:客户端应用程序是一个 C# windows 应用程序。网站正在运行 RoR 3.2。
发送http put的c#代码
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());
}
}
客户端 C# 日志记录语句
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"]}
从那时起,它只创建该 json 而不发送它。
显示放置请求的服务器日志
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
我每 60 秒运行一次的方法是在 c# 中使用计时器。但我只是困惑为什么代码停止输入 using 语句并因此停止发送 JSON 字符串。您可以通过 C# 代码中的日志记录语句来判断这一点。我不确定 using 语句是如何工作的,我只是从网上找到的一个示例中修改了该语句以发送 http 请求。因此,如果有人也可以解释 using 语句,那就太好了。
添加定时器代码。
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();
}
我现在在日志中发现了异常。例外情况如下。但不确定是什么意思。
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)
更新: 所以我做了更多的调试,我注意到当我收到错误时,我的代码会一直运行到这一行
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
也许它试图创建一个流写入,当我请求流时我得到一个空响应?不确定。但例外是说某事是空的。
【问题讨论】:
-
您错过了最重要的一段代码。.Net 中提供的众多计时器中,您使用的是哪个计时器以及如何使用?
-
现在把定时器代码放进去!
-
异常似乎是说您使用空参数调用了方法
HttpPutRequest。在方法开头打勾:if (Json == null) throw new ArgumentNullException(); -
我添加了 if 语句,我仍然得到与上面相同的异常。同样奇怪的是,一旦出现此错误,错误就会不停地重复,直到我重新启动程序,但奇怪的是我仍在打印出可读的 JSON 字符串(通过日志)。
-
我觉得这条线有问题
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
标签: c# http networking