首页 > 解决方案 > 如何在继续使用 HttpWebRequest 发布数据的同时检查 HTTP 响应

问题描述

我需要将数据发布到 REST 服务器。这些数据是动态的,所以我不知道在发送帖子时它会有多大,因为我是从另一个位置实时获取的。但是,当接收到足够的数据时,服务器会回复。

我尝试使用 HttpWebRequest 来做到这一点。但是,如果我在写入请求流之前调用 BeginGetResponse,那么写入请求流会导致异常。显然,收到回复会阻止我发送其他信息。我如何判断服务器是否在没有得到实际响应的情况下发送了响应?

这是代码。

async private Task SendDataFile(ChannelParameters cp)
    {
        var uri = new Uri("http://" + Properties.Settings.Default.dnn_servers[0] + ":" + Properties.Settings.Default.dnn_ports[0]);
        string request_uri = "http://" + Properties.Settings.Default.dnn_servers[0] + ":" + Properties.Settings.Default.dnn_ports[0] + String.Format("/v1/speech:recognize/{0}?key={1}&confidence-threshold={2}&do-endpointing={3}",
          cp.current_name, rest_app_key, Properties.Settings.Default.usConfidenceThreshold, Properties.Settings.Default.endpointing);


        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(request_uri);
        httpWebRequest.Method = "POST";
        httpWebRequest.PreAuthenticate = false;
        httpWebRequest.AllowWriteStreamBuffering = false;
        httpWebRequest.SendChunked = true;
        httpWebRequest.Headers["Accept-Language"] = Properties.Settings.Default.Resource.ToString();
        httpWebRequest.Accept = "*/*";
        //st.Write(b, 0, b.Length);
        //st.Write(b, 0, b.Length);
        //...
        switch (main_window.parameters.stream_format)
        {
            case 0:
                httpWebRequest.ContentType = "audio/L16; rate=8000";
                break;
            case 1:
                httpWebRequest.ContentType = "audio/PCMU; rate=8000";
                break;
            case 2:
                httpWebRequest.ContentType = "audio/PCMA; rate=8000";
                break;

        }
        httpWebRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), httpWebRequest);

        //httpWebRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), httpWebRequest); can't remove the comment on this line.
        allDone.WaitOne();

    }

    private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {

        done_stream = false;
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        // End the operation
        Stream postStream = request.GetRequestStream();
        request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
        while (stream_data_event.WaitOne() && !done_stream)
        {
            stream_data_event.Reset();
            long write_position = main_window.stream_memory.Position;
            main_window.stream_memory.Seek(0, SeekOrigin.Begin);
            try
            {
                postStream.Write(main_window.stream_memory.GetBuffer(), 0, (int)write_position);
            }
            catch (Exception e)
            {
                main_window.AddToLog(e.ToString());
            }
            main_window.stream_memory.Position = 0;

        }
        postStream.Close();
        request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
    }

    private void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

        // End the operation
        HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
        ////done_stream = true;
        main_window.StopRecord();
        Stream streamResponse = response.GetResponseStream();
        StreamReader streamRead = new StreamReader(streamResponse);
        string responseString = streamRead.ReadToEnd();
        Console.WriteLine(responseString);
        // Close the stream object
        streamResponse.Close();
        streamRead.Close();
        // Release the HttpWebResponse
        response.Close();
        allDone.Set();
    }

有人尝试过这样的事情吗?

标签: poststreamhttpwebrequest

解决方案


推荐阅读