post - 如何在继续使用 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();
}
有人尝试过这样的事情吗?
解决方案
推荐阅读
- php - laravel 的生产模式和开发模式有什么区别?
- node.js - 使用 Admin Firebase 使用电子邮件和电话提供商创建用户
- java - 实现 cli 应用程序的适当方法,该应用程序还使用 Micronaut 的服务配置文件
- python - 使用常用列值作为数据框的索引设置索引
- database - 为什么 react-native 应用程序不能像 MongoDB 一样使用远程存储?
- db2 - 如何在sql/pl中做一个子过程
- react-native - 如果字符串为空,如何在反应导航中设置默认标题?
- reactjs - 我将如何为来自操作的 JSON 数据定义我的接口?
- php - 从 html 切换到 php 时消失的元素和奇怪的行为
- ubuntu - Gazebo sim 未运行,因为未找到安装的 netifaces 模块