- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个用 C# 编写的 ASP.NET 3.5 服务器应用程序。它使用 HttpWebRequest 和 HttpWebResponse 向 REST API 发出出站请求。
我已经设置了一个测试应用程序来在单独的线程上发送这些请求(以模糊地模拟针对服务器的并发)。
请注意,这更像是一个单声道/环境问题,而不是代码问题;所以请记住下面的代码不是逐字的;只是功能位的剪切/粘贴。
这是一些伪代码:
// threaded client piece
int numThreads = 1;
ManualResetEvent doneEvent;
using (doneEvent = new ManualResetEvent(false))
{
for (int i = 0; i < numThreads; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(Test), random_url_to_same_host);
}
doneEvent.WaitOne();
}
void Test(object some_url)
{
// setup service point here just to show what config settings Im using
ServicePoint lgsp = ServicePointManager.FindServicePoint(new Uri(some_url.ToString()));
// set these to optimal for MONO and .NET
lgsp.Expect100Continue = false;
lgsp.ConnectionLimit = 100;
lgsp.UseNagleAlgorithm = true;
lgsp.MaxIdleTime = 100000;
_request = (HttpWebRequest)WebRequest.Create(some_url);
using (HttpWebResponse _response = (HttpWebResponse)_request.GetResponse())
{
// do stuff
} // releases the response object
// close out threading stuff
if (Interlocked.Decrement(ref numThreads) == 0)
{
doneEvent.Set();
}
}
如果我在本地开发机器 (Windows 7) 的 Visual Studio Web 服务器上运行应用程序,我可以增加 numThreads 并接收相同的平均响应时间,无论是 1 个“用户”还是 100 个,变化都很小。
在 Mono 2.10.2 环境中将应用程序发布和部署到 Apache2,响应时间几乎呈线性增长。 (即,1 个线程 = 300 毫秒,5 个线程 = 1500 毫秒,10 个线程 = 3000 毫秒)。无论服务器端点如何(不同的主机名、不同的网络等),都会发生这种情况。
使用 IPTRAF(和其他网络工具),应用程序似乎只打开 1 或 2 个端口来路由所有连接,其余响应必须等待。
我们构建了一个类似的 PHP 应用程序,并在 Mono 中部署了相同的请求和相应的响应。
我已经遍历了我能想到的针对 Mono 和 Apache 的每一个配置设置,两种环境之间唯一不同的设置(至少在代码中)是有时 ServicePoint SupportsPipelining=false 在 Mono 中,而它是从我的机器上看是真的。
由于某种原因,似乎 ConnectionLimit(默认值为 2)没有在 Mono 中更改,但我在代码和指定主机的 web.config 中将其设置为更高的值。
要么我和我的团队忽略了一些重要的事情,要么这是 Mono 中的某种错误。
最佳答案
我相信您在 HttpWebRequest
中遇到了瓶颈。每个 Web 请求都使用 .NET 框架内的公共(public)服务点基础结构。这似乎是为了允许重复使用对同一主机的请求,但根据我的经验,这会导致两个瓶颈。
首先,为了符合 HTTP 规范,服务点默认只允许两个到给定主机的并发连接。这可以通过将静态属性 ServicePointManager.DefaultConnectionLimit
设置为更高的值来覆盖。看这个MSDN页面了解更多详情。看起来您已经在为单个服务点本身解决这个问题,但由于服务点级别的并发锁定方案,这样做可能会导致瓶颈。
其次,ServicePoint
类本身似乎存在锁定粒度问题。如果反编译并查看 lock
关键字的源代码,您会发现它使用实例本身进行同步,并且在很多地方都是这样做的。随着服务点实例在给定主机的 Web 请求之间共享,根据我的经验,随着打开更多 HttpWebRequests
并导致其扩展性很差,这往往会成为瓶颈。第二点主要是个人观察和源头探索,所以要持保留态度;我不认为它是权威来源。
不幸的是,我在使用它时没有找到合理的替代品。既然已经发布了 ASP.NET Web API,您不妨给 HttpClient看看。希望对您有所帮助。
关于c# - HttpWebResponse 不会针对并发出站请求进行扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9997143/
与来自 HttpWebResponse.GetResponseStream() 的流一起使用的最佳缓冲区大小是多少? 在线示例的大小从 256b 到 5Kb 不等。是什么赋予了?我猜缓冲区大小可能是视
我完全不知道如何解析这个多部分的 httpresponse。这是我收到的格式: MIME-Version: 1.0 RETS-Version: RETS/1.8 RETS-Server: Intere
我试图弄清楚我的网络请求在最终到达最终内容之前被重定向了多少次。 我正在创建我的网络请求,如下所示: var httpRequest = (HttpWebRequest) WebRequest.Cre
我是 c# 的新手,正在制作一个简单的代理来编辑某些 header 。 我已经使用 HttpLisenter 获取请求,然后使用 HttpWebRequest 和 Response 进行编辑、发送和接
这个问题在这里已经有了答案: Garbled httpWebResponse string when posting data to web form programmatically (1 个回答
我有一些代码可以下载我已经使用了一段时间的网页的内容。这段代码工作正常,从来没有出现过问题,现在仍然没有……但是,有一个页面相当大(2MB,没有图像),有 4 个表,分别有 4、20、100、600
我正在开发一个每 5 秒自动查询一次网站的程序。它在过去几天一直运行良好,但今天当我只是重新启动它时,它一直在下面标记的行上抛出 System.ObjectDisposedException。我应该提
我收到来自 HttpWebRequest 的回复(使用修改后的版本 Jeff Richter's CCR wrappers ),然后检查一些 header 以决定是否继续下载。有时我可能不想继续,所以
我遇到了编码问题。当我获得网站的源代码时,我有: 我像这样将编码设置为 UTF8: StreamReader reader = new StreamReader(response.GetRespons
我在下面的代码中收到超时异常。只有这个网站有问题。有什么问题? string ackoURL = "https://www.zomato.com/sk/brno/u-heligonky-z%C3%A1
我正在尝试编写一个重定向检查器,我的解决方案是今天早上刚刚组合在一起的,所以它不是最有效的,但除了一件事之外它可以完成我需要它做的所有事情: 它只在停止前检查两个站点,没有发生错误,它只是在“requ
我正在使用以下代码来读取响应: using (Stream MyResponseStream = hwresponse.GetResponseStream()) { byte[] My
我有一个帮助程序类,它有一个方法,该方法设置为获取信息以生成 HttpWebRequest。目前的方法返回一个 HttpWebResponse。 HttpWebResponse httpRespons
我正在编写自定义 ActionFilterAttribute 并尝试将一些数据直接写入 ASP.NET MVC 3 中的输出流。我正在编写的数据就是我需要响应的所有数据,但是在我的数据渲染 View
使用 Fiddler 运行以下代码显示加号正在转换为某种空白字符。我应该使用什么编码来防止数据被转换?我想保留加号等。 编辑:更新的代码示例 string postData = "test1=test
我们公司与另一家名为 iMatrix 的公司合作,他们拥有用于创建我们自己的表单的 API。他们已经确认我们的请求正在访问他们的服务器,但响应应该以由参数确定的几种方式之一返回。我收到 200 OK
应用正在与 REST 服务对话。Fiddler 显示完整的良好 XML 响应作为 Apps 响应该应用程序位于法属波利尼西亚,在新西兰有一个相同的副本,所以主要嫌疑人似乎在编码,但我们已经检查过了,结
HttpWebResponse.LastModified 是否准确?它总是存在吗?我的项目是创建一种专注的网络爬虫,如果我将使用资源的哈希值或仅使用 HttpWebResponse.LastModif
我有一个用 C# 编写的 ASP.NET 3.5 服务器应用程序。它使用 HttpWebRequest 和 HttpWebResponse 向 REST API 发出出站请求。 我已经设置了一个测试应
我有制作HTTP POST的方法 我这样用try catch调用这个方法 try { returnString = MakePost(gatewayEnpoint, data); retu
我是一名优秀的程序员,十分优秀!