问题标签 [servicepoint]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1323 浏览

c# - 为什么服务器会强制关闭连接?它对客户有什么期望?

在尝试从我在手持设备上运行的应用程序在本地网络上运行的服务器应用程序上调用 REST 方法时,它失败并显示“无法为 SSL/TLS 建立安全通道 ...System.Net.Sockets.SocketException: An现有连接被远程主机强行关闭”。

在 .NET 的更新/全功能版本中,您可以将此代码添加到客户端:

...如图所示接受服务器的响应。不过,这在我的 Windows CE / Compact Framework 应用程序中对我不可用 - 尽管 ServicePointManager 是“已知数量”,但 ServerCertificateValidationCallback 不是。这显然是 Windows.NET 程序集的一部分,我在这个项目中不可用。

所以,假设仍然有办法完成同样的事情(接受 ssl 化服务器的响应),在这种情况下如何做到这一点?

一种建议的解决方法是向我的客户添加一个类,如下所示:

...然后在应用程序启动时调用它(例如在主窗体的 Load() 事件中):

...但我的日志文件中仍然出现此异常:

顺便说一句,TrustAllCertificatesPolicy 的(空)构造函数可能没有实际意义,因为它是灰色的。

服务器对客户端的期望究竟是什么?为什么服务器会强制关闭连接?

更新

在尝试确定客户端代码或服务器代码是否存在问题时,我尝试通过 Postman 访问 URL,但得到以下信息:

在此处输入图像描述

因此,我按照“在 Chrome 中导入 SSL 证书”链接查看是否有帮助。

[ http://blog.getpostman.com/index.php/2014/01/28/using-self-signed-certificates-with-postman/]告诉我:

原来有一个更好的解决方案可以解决这个问题,而且它也避免了每次启动浏览器时给 Chrome 添加异常。这就是你的做法:

但是,在进入https://localhostChrome 时,我得到“此网页不可用”

尝试http://localhost代替(“http”而不是“https”),OTOH,我得到了一个“IIS7”图像,在一系列(人类)语言中带有“欢迎”。

至于第 2 步(“单击 URL 栏左上角的锁定图标。”),我在那里看不到这样的东西;这就是我所看到的:

在此处输入图像描述

那么我注定要失败了吗?

0 投票
0 回答
374 浏览

c# - 多线程 HTTPWebRequests 消耗 CPU

我想使用 .net 运行大约 10.000 个并发请求HttpWebRequest,并非所有请求都进入同一主机,其中一些通过代理池。

我目前使用的线程最多可以处理 1000 个并发请求(在任务管理器中大约等于 3%),但是当我扩展到 2000 个甚至 5000 个并发请求时,我会遇到很多异常(见下文)和 100% 的 cpu 负载。
当我注意到我认为它对服务器来说太多了,但是运行例如 2 个具有 1000 个并发的实例也可以工作,所以我猜测它与连接管理有关。

首先:请求的示例代码(猜测一切都很好,直到大规模)

是的,当然我(认为我)也设置了 ServicePointManager 正确:

奇怪的是,即使应用程序甚至没有使用连接限制的一半,我也会超时(没有真正的超时,它的超时就像当您的 DefaultConnectionLimit 较低并尝试使请求并行时发生的那样)。

所以我决定尝试使用 ConnectionGroupName 给每个线程一个唯一的连接:

这至少增加了打开的 TCP 连接,所以我不仅扩展了 .NET DefaultConnectionLimit,还增加了 Windows 下可用的动态 TCP 端口,例如http://kb.globalscape.com/KnowledgebaseArticle10438.aspx和这个netsh int ipv4 set dynamicport tcp start=1025 num=50000

奇怪的事情是该应用程序现在打开了如此多的连接,这不是必需的,但仍然有很高的 cpu 镜头并且仍然很少超时(但比以前好多了,所以它可能与连接管理有关?)。


为了完整性:我有时也会遇到这些异常(但不经常):

所以我的问题是我该如何解决这个问题?我做错了吗?有解决方法吗?我可以自己管理连接吗?是否有另一种适用于这种情况的类/语言?等等

0 投票
1 回答
1550 浏览

c# - 几个小时并行发送 HTTP 请求后,ServicePoint 对象变大

我们使用HttpClient并行向远程 Web API 发送请求:

该 API 可以被多个线程同时调用。运行大约四个小时后,我们发现发生了内存泄漏问题,从 profiling 工具来看,似乎有两个ServicePoint对象,其中一个相当大,大约 160 MB。

据我所知,我可以看到代码上面的一些问题:

  • HttpClient我们应该尽可能地共享实例。在我们的例子中,请求地址和标头可能会有很大差异,那么这是我们可以做点什么还是不会损害太多性能?我只是想到我们可以准备一个字典来存储和查找HttpClient实例。
  • 我们没有修改DefaultConnectionLimitof ServicePoint,所以默认只能同时向同一个服务器发送两个请求。如果我们把这个值改大一点,内存泄漏问题就可以解决了吗?
  • 我们还抑制了 HTTPS 证书验证:ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };这与问题有关吗?

由于这个问题不容易重现(需要很多时间),我只需要一些想法,以便我可以优化我们的代码以长时间运行。

0 投票
1 回答
258 浏览

web-services - PSH Runspaces + New-WebServiceProxy = 2 连接限制?

我需要一个调用内部 Web 服务的高性能脚本。因此,我编写了一个 powershell 脚本来创建运行空间线程,每个线程都向一个公共 Web 服务代理对象 (New-WebServiceProxy) 发出请求。

我发现无论我创建的线程数量和 Web 服务应用程序池工作进程的数量如何,我都只能从运行脚本的计算机同时建立 2 个 HTTP 连接,因此 Web 服务中只发生了两个进程。这并没有给我足够快的结果。

通过在多台客户端计算机上运行我的脚本,我可以在对 Web 服务器施加压力之前将我的工作进程提高到 8 个。我需要使用一个 powershell 脚本在代码中到达那里。

我尝试将此注册表项设置为 8:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\MaxConnectionsPerProxy

这看起来确实可能提高了我的脚本的性能,但我仍然只看到 2 个与 Web 服务的 HTTP 连接。

似乎真正的解决方案是管理这个 .Net 属性:

https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit(v=vs.110).aspx

有人可以向我解释如何在 powershell 中处理这个问题吗?我无法弄清楚 New-WebServiceProxy 返回的对象与 ServicePoint 类之间的任何联系?那么在 Powershell 中设置什么来改变这 2 个连接限制呢?

0 投票
0 回答
281 浏览

c# - 在 ServicePoint 上永久设置属性的正确方法

我想在特定连接上关闭 Nagle 算法(在我的情况下 - 到 ElasticSearch 服务器)。

我的代码目前看起来像这样:

问题是ServicePoint对象在一段时间后被回收,这导致它丢失了设置。因此,我不能只在系统启动时运行此代码一次。看来我面前有几个选择:

  1. 全局关闭 Nagle 算法(因此,影响我不想影响的连接)。
  2. 增加MaxServicePointIdleTime,以便ServicePoint永远不会被回收(可能是个坏主意?我的直觉告诉我)。
  3. 设置某种计时器,每 N 秒重置一次属性,其中 N 小于 a 的回收时间ServicePoint
  4. 每次使用连接时重置属性。

我真的不喜欢这些选项中的任何一个,它们要么会影响系统中的其他东西,要么对于我想做的事情来说似乎太复杂了(比如计时器选项)。在我看来,应该有一个简单的解决方案。想法?

0 投票
0 回答
47 浏览

c# - 检测 HttpWebRequest 的真正开始

我是一个使用.TAP 模式API编写的网络爬虫HttpWebRequest

我想从中下载一些东西,http://somedomain.tld但我最终可能会发送相当多的请求。我不知道是否somedomain.tld会及时回复,我希望每个请求不超过 10 秒以完成发回回复。我还想利用ServicePoint该域强制执行的连接限制。

所以我需要能够根据请求超时。通常,我会从 a 获得取消令牌CancellationTokenSource

并将其提供给我的异步操作,也许还注册一个调用的取消回调myWebRequest.Abort(),所以我最终得到一个看起来像这样的(简化)方法:

到目前为止,一切都很好。

让我稍微限制一下:

现在,ServicePoint关联的实例somedomain.tld一次只允许一个请求。

现在我同时发出两个请求,安全地知道这ServicePoint将使目标域免受我的滥用:

现在,让我们假设第一个请求需要超过 10 秒才能完成......因为我已经限制ServicePoint一次只触发一个请求,ServicePoint当轮到触发第二个请求时,它已经被取消并且中止。

那么我怎么知道请求实际上是什么时候发送的呢?如何设置“知道”ServicePoint与特定请求有关的操作的超时?

0 投票
1 回答
2238 浏览

vb.net - ASP.NET "The request was aborted: Could not create SSL/TLS secure channel" occurs also with configured servicepointmanager

I'm trying to request this image: https://www.kamerstunt.nl/file/img/web/woning/9577323WenumWieselZwolseweg-142d_6.jpg If the image no longer exists when you read this, it might have been removed, but you'd still be able to view the SSL certificate in question. Using my browser I was able to successfully navigate to the page, request the image and see a valid SSL certificate.

I checked here: The request was aborted: Could not create SSL/TLS secure channel

So I added that solution to my code:

I tried:

But then I get errors: 'Tls12' is not a member of 'System.Net.SecurityProtocolType' and 'Tls11' is not a member of 'System.Net.SecurityProtocolType'

I also tried to change the registry to allow windows to not block DHE with 512 bits and added ClientMinKeyBitLength with 0x00000200(512) value under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman.

But still it fails...why?

0 投票
0 回答
639 浏览

c# - 使用 BindIPEndPointDelegate 绑定不同 IP 的 webrequests 不会导致多线程中同一主机的多个 ServicePoint

类别:

吞吐量增量

设想:

多个 HttpWebRequest需要通过不同的以太网适配器发送到同一主机。

要记住的关键:

示例代码:

完整的要点(目标框架 .Net 2.0)。

想要做:

webreq1 ----- 发送通过 ------- eth1
webreq2 ----- 发送通过 ------- eth2
webreq3 ----- 发送通过 ---- --- eth3

怎么了:

  • 如果 webreq1 --- 通过连接发送 ---- eth1
    • webreq2 -- 通过连接发送 ---- eth1 (绑定到 eth2 )
    • webreq3 -- 通过连接发送 ---- eth1 (绑定到 eth3 )
  • webRequest.ServicePoint.GetHashCode() 为所有 web 请求提供相同的哈希值。

问题(未解决):

  • 每个 webrequest 都使用相同的服务点,尽管通过 ServicePoint 上的 BindIPdelegate 为每个 HttpWebRequest 明确设置为使用不同的以太网连接。

问题(已解决):

  • 来自不同线程中的 webrequests 对同一主机的多个请求。(通过设置 servicepoint.ConnectionLimit 解决)(上面提到的来源)。

进一步的解决方案(将实施,如果没有解决):

  • 使用原始套接字。
  • 如果依赖于相同的 servicemanager-servicepoint 场景,此解决方案可能不起作用。

请求的建议。问候。开发者。

0 投票
0 回答
654 浏览

performance - 性能最佳的 HttpClient / ServicePointManager 设置?

我正在使用HttpClient向多个服务器发出批量请求。在任何给定时间,可能有许多批次正在进行中。

我每批使用一个 Httpclient,它们都将发送到同一台服务器。因此,如果我有 3 份工作在飞向 3 台服务器,我会在每台服务器上使用一个 HttpClient。

一个作业向服务器端点发出100 到 2000 个请求,并向 asysnc 发出 3 到 5 个请求

服务器端点配置超出了我的控制范围。

我想知道什么是确保成功和性能的最佳设置?

例如,我已经有一个 ServicePointManager。始终返回 true 的ServerCertificateValidationCallback。我设置了 ServicePointManager。默认连接限制为 100

我想知道 ServicePointManager 之类的设置需要哪些设置。安全 协议服务点管理器。SetTcpKeepAlive其他什么?

始终确保成功,特别是围绕他们的 HTTP/HTTPS 设置以及哪些调整可能有助于提高性能?

0 投票
0 回答
921 浏览

.net - 如何使用 .net 调试工具查找因 ServicePoint 限制设置错误而阻塞的 HttpWebRequest/Response 或 Connections

今天,我有一个问题,我的生产网络服务器的 iis 连接非常高,cpu 和内存都在正常水平。从 Zabbix(一个开源监控软件,从服务器/性能计数器收集数据,在 Web 上显示),我可以看到很多“ASP.NET Requests Queued(一个性能计数器)”。所以我从服务器得到一个转储。我使用 DebugDiag2.2 自动分析转储。它报告说:

该线程正在发出 HttpWebRequest 并等待远程服务器响应。这些请求中的一个或多个正在使用其最大可用连接数的至少一半。

警告,至少有一半的可用连接正在使用中

HttpRequest URI:http : //ws.product.aaa.bbb.com/product.search/api/x-protobuf/SearchData ServicePoint - ConnectionLimit:32 CurrentConnections:31

我谷歌了一会儿,然后找到链接“ asp-net-performance-case-study-web-service-calls-taking-forever ”和“ Timeouts when Making Web Requests in .NET

我的服务器使用 .net 4,我尝试按照步骤转储出等待列表,其中是在 Zabbix 上绘制的那些 iis 连接。

我找到了腰围,但尺寸为 0。

我使用 foreach 循环转储所有候补名单,

在输出中,_size=0 和 _items =000000d43805cb70。

截至目前,我不知道“排队请求”在哪里。你能帮忙看看吗?