我正在使用POST调用Web服务并接收2MB xml。 问题是我需要花费很多时间才能使用Stream中的数据。 响应似乎是在7秒之后,但是从响应流中读取内容(它是一个字符串)还需要10秒。
Stopwatch s = new Stopwatch();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(MyUri);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = Poststring.Length;
s.Start();
StreamWriter swriter = new StreamWriter(req.GetRequestStream());
swriter.Write(Poststring);
swriter.Close();
// Get the response. 7 sec
HttpWebResponse response = (HttpWebResponse)req.GetResponse();
s.Stop();
Debug.WriteLine("Talking to Web-Service: "+s.ElapsedMilliseconds);
s.Reset();
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader(dataStream);
// Read the content. 10 sec
XmlReader xmlReader = XmlReader.Create(dataStream);
s.Start();
XDocument xdoc = XDocument.Load(xmlReader);
s.Stop();
Debug.WriteLine("Convert stream to some useful data: "+s.ElapsedMilliseconds);
以毫秒为单位输出
Talking to Web-Service: 6595
"Convert" stream to some useful data: 10772
为什么读取内容需要10秒? 在阅读内容时,是否与网络服务进行了一些通信或等待数据?它只是一个简单的文本文件(xml),大约2MB。我认为那些2 MB在6596毫秒内被转移。因为当我用浏览器调用该服务时,xml内容将在6-7秒内显示。
与Web服务交谈的时间还可以,但在10772毫秒内发生了什么?
编辑:问题仍然存在。我得到了不同的答案,他们相互矛盾。
答案 0 :(得分:1)
添加以下
httpWebRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
导致:
Talking to Web-Service: 6595
"Convert" stream to some useful data: 256
现在我的性能与浏览器相同!
答案 1 :(得分:0)
XDocument xdoc = XDocument.Load(response.GetResponseStream(), LoadOptions.None);
避免使用XmlReader.Create并使用XDocument.Load(Stream,LoadOptions)重载。 http://msdn.microsoft.com/en-us/library/cc838321.aspx
答案 2 :(得分:0)
GetResponse
不会返回完整的响应流。 GetResponse
将根据响应中的标头信息发送您的请求并返回HttpWebResponse
对象。 HttpWebResponse
还有一个关联的流,您可以从中读取完整的响应正文。这正是你在做的事情。
我怀疑您在调用GetResponse
时看到的7秒延迟是服务器在生成XML文档和发送响应时的延迟。 XmlReader.Create
上的10秒延迟是通过读取响应流(即下载文件)。
是否动态生成XML?对于HTTP响应,7秒不是非常长的时间,当然取决于您的服务器位置,质量等。