2015-08-21 86 views
2

我正尝试在C#中编写一个工具来帮助QA解决一些网络问题,并且遇到了问题。该程序应该每秒向服务器发送一个JSON格式的查询。当在循环中使用StreamWriter时出现“Stream not Writable”错误

目前,它一次,但第二次尝试发送查询,我得到一个例外,因为

“流不写。”

这里是我的代码:

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"); 
    } 
} 
} 

任何人都知道我做错了吗?

回答

2

首先,停止全球变量。将streamwriter,streamreader,httpwebresponse等移入实际的计时方式。

任何实现IDisposable,大部分的东西都应该是非常局部的变量,这些变量不会在四处闲逛,并且会包含在using子句中。

一旦你的方法完成,基本上你的请求对象被关闭。

像这样的事情会工作好了很多:

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"); 
} 

}

+0

谢谢!这很好! – MacHume

0

所以我认为这是扔writeData.Write(query)request.GetRequestStream()应该只能写入,直到请求实际发送完毕,我相信这是在您拨打request.GetResponse()时完成的。所以它在第一次打勾时工作,但是然后发送请求并且不能第二次写入。

您是否尝试多次发送请求?您需要重新初始化请求对象。

相关问题