Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;“流不可写”;在循环中使用StreamWriter时出错_C#_Json_Streamwriter - Fatal编程技术网

C# &引用;“流不可写”;在循环中使用StreamWriter时出错

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

我试图用C语言编写一个工具来帮助QA解决一些网络问题,但遇到了一个问题。程序应该每秒向服务器发送一个JSON格式的查询

目前,它只工作一次,但在第二次尝试发送查询时,我得到一个异常,因为

“流不可写。”

这是我的密码:

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());

            }
        }