C# &引用;“流不可写”;在循环中使用StreamWriter时出错
我试图用C语言编写一个工具来帮助QA解决一些网络问题,但遇到了一个问题。程序应该每秒向服务器发送一个JSON格式的查询 目前,它只工作一次,但在第二次尝试发送查询时,我得到一个异常,因为 “流不可写。” 这是我的密码:C# &引用;“流不可写”;在循环中使用StreamWriter时出错,c#,json,streamwriter,C#,Json,Streamwriter,我试图用C语言编写一个工具来帮助QA解决一些网络问题,但遇到了一个问题。程序应该每秒向服务器发送一个JSON格式的查询 目前,它只工作一次,但在第二次尝试发送查询时,我得到一个异常,因为 “流不可写。” 这是我的密码: public partial class Form1 : Form { Timer timer1; String query; String result; HttpWebRequest request; StreamWriter wri
public partial class Form1 : Form
{
Timer timer1;
String query;
String result;
HttpWebRequest request;
StreamWriter writeData;
StreamReader readData;
HttpWebResponse response;
public Form1()
{
InitializeComponent();
timer1 = new Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 1000;
File.Delete(AppDomain.CurrentDomain.BaseDirectory + "log.txt");
logOutput.ReadOnly = true;
request = (HttpWebRequest)WebRequest.Create("a URL goes here");
request.ContentType = "application/json";
request.Method = "POST";
query = "{some json stuff goes here}";
}
private void startButton_Click(object sender, EventArgs e)
{
if (!timer1.Enabled)
{
timer1.Start();
startButton.Text = "Stop";
}
else
{
timer1.Stop();
startButton.Text = "Start";
}
}
private void timer1_Tick(object sender, EventArgs e)
{
writeData = new StreamWriter(request.GetRequestStream());
writeData.Write(query);
writeData.Flush();
writeData.Close();
response = (HttpWebResponse)request.GetResponse();
readData = new StreamReader(response.GetResponseStream());
result = readData.ReadToEnd();
logOutput.Text = result;
File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "log.txt", result + "\r\n");
}
}
}
有人知道我做错了什么吗?所以我猜是
writeData.Write(query)
抛出的request.GetRequestStream()
只有在请求实际发送之前才应该是可写的,我相信这是在调用request.GetResponse()
时完成的。因此,它在第一次勾选时工作,但随后发送请求,第二次无法写入
您正在尝试多次发送请求吗?您需要重新初始化请求对象。首先,使用全局变量停止。将
streamwriter
、streamreader
、httpwebresponse
等移动到实际的勾选方法中
实现IDisposable
的任何东西(大多数东西都是这样做的)都应该是非常局部的变量,这些变量不会挂起,而是使用子句封装在中
基本上,一旦方法完成,请求对象就会关闭
像这样的方法会更好:
private void timer1_Tick( object sender, EventArgs e ) {
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("a URL goes here");
request.ContentType = "application/json";
request.Method = "POST";
String query = "{some json stuff goes here}";
String result = String.Empty;
using ( StreamWriter writeData = new StreamWriter(request.GetRequestStream()) ) {
writeData.Write(query);
writeData.Flush();
using ( HttpWebResponse response = (HttpWebResponse)request.GetResponse() ) {
using ( StreamReader readData = new StreamReader(response.GetResponseStream()) ) {
result = readData.ReadToEnd();
}
}
}
logOutput.Text = result;
File.AppendAllText(AppDomain.CurrentDomain.BaseDirectory + "log.txt", result + "\r\n");
}
}如果不重新初始化请求,则会导致类似问题。正如ryachza所提到的,我已经将请求初始化推到了循环中,它对我起了作用
foreach (String item in DATA)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
request.Method = "POST";
request.ContentType = "application/json";
using (Stream webStream = request.GetRequestStream())
using (StreamWriter requestWriter = new StreamWriter(webStream, System.Text.Encoding.ASCII))
{
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Object routes_list =
json_serializer.DeserializeObject(item);
requestWriter.Write(item);
}
WebResponse webResponse = request.GetResponse();
using (Stream webStream = webResponse.GetResponseStream() ?? Stream.Null)
using (StreamReader responseReader = new StreamReader(webStream))
{
response.Add(responseReader.ReadToEnd());
}
}