我正在用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秒??当内容被读取时,是否仍有一些与web服务的通信或等待数据?它只是一个大约2MB的简单文本文件(xml(。我以为那2MB是在6596毫秒内传输的。因为当我用浏览器调用该服务时,xml内容显示为6-7秒
与Web服务对话的时间还可以,但在这10772毫秒内发生了什么?
编辑:问题仍然存在。我得到了不同的答案,它们彼此矛盾。
添加以下
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
现在我有了和浏览器一样的性能!
XDocument xdoc = XDocument.Load(response.GetResponseStream(), LoadOptions.None);
避免使用XmlReader。创建并使用XDocument。加载(流,加载选项(过载。http://msdn.microsoft.com/en-us/library/cc838321.aspx
GetResponse
不会返回完整的响应流。GetResponse
将发送您的请求,并根据响应中的标头信息返回一个HttpWebResponse
对象。HttpWebResponse
还有一个相关流,您可以从中读取完整的响应正文。这正是你正在做的。
我怀疑您在调用GetResponse
时看到的7秒延迟是服务器上生成XML文档和发送响应的延迟。XmlReader.Create
上的另外10秒延迟来自读取响应流(即下载文件(。
XML是动态生成的吗?7秒对于HTTP响应来说不是很长的时间,当然这取决于您的服务器位置、质量等。