2010-01-18 35 views
1

我在某些ASP.NET页面的后端调用RESTful Web服务。HttpWebRequest后的StreamReader ReadToEnd()EndGetResponse() - 最具扩展性?

我使用ASP.NET异步页面,因此在引擎盖下我使用的方法:

HttpWebRequest的BeginGetResponse()

HttpWebRequest的EndGetResponse()

将R esponse字符串在我的情况下总是一个JSON字符串。我用下面的代码来读取整个字符串:

using (StreamReader sr = new StreamReader(myHttpWebResponse.GetResponseStream())) 
{ 
    myObject.JSONData = sr.ReadToEnd(); 
} 

这种方法在可伸缩性方面是否可行?我看过其他代码示例,它们使用Read()以块的形式检索响应数据。我的主要目标是可扩展性,因此可以跨多个并发页面点击进行后端调用。

感谢, 弗兰克

回答

0

这取决于你的意思是 “可扩展性” 的东西。如果你正在谈论能够处理越来越大的文件,我会说它不是非常可扩展的。由于您使用的是单个ReadToEnd,因此巨大的流将需要将整个流读入内存,然后才能执行操作。随着应用程序流在数量,复杂性和规模上的增长,您将发现这将开始妨碍服务器处理请求的性能。您也可能会发现,您的应用程序池将在您的请求期间开始自行回收(如果您最终获得了大量虚拟内存)。

如果数据流总是会短小你只关心创建流的数量,我不明白为什么这不会,只要你的数据流都依赖于打开的文件,数据库连接扩展等

+0

处理大文件是不是一个问题 - 在JSON响应一般都在1-10千字节的范围内。 我指的是它可以处理多个并发请求的意义上的可伸缩性。 – frankadelic 2010-01-18 23:50:18

+0

我想说,保持你的流独立于任何资源霸占分配代码 - 基本上任何辅助流或连接对象,它应该与您的应用程序池一起扩展。它会归结为CPU /内存/网络功能。保持代码的适当范围(如你的小例子)应该允许异步地进行大量的同时连接。 – 2010-01-19 01:53:59

+0

您是否将HTTP请求从您的ASPX应用程序发送到相同的后端服务器?如果是这样,您需要提高WebRequest设置中的最大连接限制。否则,即使您的IIS服务器正在为大量客户端提供服务,页面也会受到可用于HTTPWebRequest的传出连接数量的限制。 可以设置的限制如下: ServicePointManager.DefaultConnectionLimit = 100; //例如; – feroze 2010-01-23 18:56:51