- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一个使用 web 服务来推送一些事件的客户端 - web 服务的设计是这样的,即在客户端发布订阅命令时,它会发回一些感兴趣的事件并继续这样做只要客户端保持连接。
当 POST 命令时,服务会(立即)响应这些 header 的初始答案
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked
然后保持连接打开直到超时(30 秒后,如果客户端没有发送一些保持事件数据)
由于它是 POST + 必须读取响应 + 保持连接打开直到 endOFStream 的混合体,看来我必须将 HttpWebRequest 与 BeginGetRequestStream(到 POST)和 BeginGetResponse 一起使用来读取响应并根据响应执行操作。
我的问题是,尽管 AllowReadStreamBuffering 被设置为 false,但直到输入流被服务器/服务实际关闭(30 秒后),BeginGetResponse 回调才会被调用。
文档在 AllowReadStreamBuffering 上是这样说的:
The AllowReadStreamBuffering property affects when the callback from BeginGetResponse method is called. When the AllowReadStreamBuffering property is true, the callback is raised once the entire stream has been downloaded into memory. When the AllowReadStreamBuffering property is false, the callback is raised as soon as the stream is available for reading which may be before all data has arrived.
我看到了一些建议,无论 AllowReadStreamBuffering 设置成什么,HttpWebRequest 都不会调用 BeginGetResponse,直到它的缓冲区被填满 - 但我无法在文档中找到任何相关信息。
有没有人知道如何控制这种缓冲行为,或者对我在处理这种网络服务时应该尝试的另一种方法提出建议?
我目前使用的相关代码片段如下所示:
public void open()
{
string url = "http://funplaceontheinternet/webservice";
HttpWebRequest request = WebRequest.CreateHttp(url);
request.Method = "POST";
request.Credentials = new NetworkCredential("username", "password");
request.CookieContainer = new CookieContainer();
request.AllowReadStreamBuffering = false;
request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
}
void GetRequestStreamCallback(IAsyncResult result)
{
Debug.WriteLine("open.GetRequestStreamCallback");
HttpWebRequest webRequest = (HttpWebRequest)result.AsyncState;
// End the stream request operation
Stream postStream = webRequest.EndGetRequestStream(result);
// Create the post data
byte[] byteArray = Encoding.UTF8.GetBytes(_xmlEncodedSubscribeCommand);
// Add the post data to the web request
postStream.Write(byteArray, 0, byteArray.Length);
postStream.Close();
// Start the web request
webRequest.BeginGetResponse(new AsyncCallback(BeginGetResponseCallback), webRequest);
}
void BeginGetResponseCallback(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = null;
if (request != null)
response = (HttpWebResponse)request.EndGetResponse(result);
else
Debug.WriteLine("request==null :-(");
if (response != null)
{
using (var reader = new StreamReader(response.GetResponseStream()))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
Debug.WriteLine("BeginGetResponseCallback - received: " + line);
}
Debug.WriteLine("BeginGetResponseCallback - reader.EndOfStream");
}
}
else
Debug.WriteLine("response==null :-(");
}
最佳答案
您提到该服务是一个网络服务,但没有提到哪个平台。如果这是一个“正常”的 Web 服务,那么我假设 XML 是传输格式。
如果是这样,我怀疑问题可能在于这种通信方式并不真正适合流式传输。在所有数据可用之前,服务器端的 Web 服务基础结构可能不会创建 SOAP 信封和负载。如果您想像这样流式传输,最好在服务器端使用一些自定义服务,而不是 Web 服务。
您确定服务器确实在流式传输响应吗? (例如用 wireshark 之类的东西确认?)
如果你真的想使用网络服务,那么我建议你在第一个事件可用时完成请求,不要等待超时。这仍将实现我假设您正在尝试获得的延迟减少。
关于c# - HttpWebRequest,直到 endOfStream 才调用 BeginGetResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15877239/
在MSE例子中,播放前调用endOfstream mediaSource.endOfStream(); video.play() https://developer.mozilla.org/en-US
我正在尝试使用代码(粘贴在下面)读取文本文件,但文件的最后一行没有被读取。我的逻辑正确吗? using (StreamReader reader = new StreamReader(
我编写了一个转换过滤器,它不会将前四帧的样本传递给渲染器,因为我在队列中提取和存储数据。因为对转换方法的调用等于帧数,所以我的最后 3 帧数据没有被调用并且数据丢失。如何解决 EndOfStream
BinaryReader 没有 EndOfStream 属性。使用以下代码检查是否已到达流结尾是否安全? reader.BaseStream.Length>reader.BaseStream.Posi
我正在我的 C# 应用程序中启动一个进程,该进程运行一个控制台应用程序。我已经重定向了标准输入和输出,并且能够通过 StandardOutput.ReadLine() 读取几行。我确信我已正确配置 P
所以我正在做一个项目,我正在读取配置文件。配置文件只是一个字符串列表,如“D 1 1”、“C 2 2”等。现在我还没有用 C# 进行过读/写,所以我在网上查找它希望找到某种形式的演绎C/C++ .eo
我正在编写一个大型应用程序,其中涉及来自进程或文件流的一些流。下面有两个示例,展示了检测流结束的不同方法。我很好奇有什么区别以及哪一个最好使用?效率或性能有什么区别吗?另外,在 .NET 引用指南中,
我正在使用一个使用 web 服务来推送一些事件的客户端 - web 服务的设计是这样的,即在客户端发布订阅命令时,它会发回一些感兴趣的事件并继续这样做只要客户端保持连接。 当 POST 命令时,服务会
正如标题所说,我发现了一个问题。先说小故事:我们的 file.txt 看起来像这样: aaaabb ccccddd eeeefffffff 有很多方法可以逐行阅读这段文字,其中一种是: StreamR
首先我明白我可以用不同的方式解决这个问题。我想这个问题的存在只是因为以不正确的方式使用了不同的方法。但我想知道在我的示例中到底发生了什么。 我正在使用 StreamReader 读取文件。为了从中获取
---简短版本:当我每次进入 while (!checkReader.EndOfStream) 时,它都会显示 EndOfStream = true。 ---更多细节:用户将使用 Ajax Async
我想在解析 XML 文档之前检测它的编码。所以我在堆栈上找到了overflow这个脚本。 public static XElement GetXMLFromStream(Stream uploadSt
我有一个 webrequest 可以创建与服务器的持久(保持事件)连接,例如: webRequest.ContentType = "application/x-www-form-urlencoded"
我写了这个小程序,它从 Random.txt 中每隔 5 个字符读取一次在 random.txt 中,我有一行文本:ABCDEFGHIJKLMNOPRST。我得到了预期的结果: A的位置为0 F的位置
我写了一个简单的测试项目,打开9123端口一段时间后退出: import java.io.IOException; import java.net.InetSocketAddress; import
我是一名优秀的程序员,十分优秀!