问题标签 [servicepointmanager]

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 投票
1 回答
691 浏览

c# - 负载均衡器更改后,HttpClient 停止重用连接

我有一个连接到云服务器设置的客户端 - 一个 HAProxy 实例(几个之一,由负载平衡器确定),然后它将请求转发到正确的后端服务器。

从客户端的角度来看,这只是一个常量 URI,但是当负载均衡器切换处理请求的 HAProxy 实例时会出现问题。发生这种情况后,HttpClient 发送的每个后续请求都来自不同的本地端口,并被后端服务器视为新连接。

持久连接对应用程序至关重要,因此这会严重破坏它。奇怪的是,一旦客户端应用程序重新启动,问题就会自行解决。这让我相信问题出在客户端,而不是云设置或后端服务器。

我在这里缺少什么吗?我认为在连接通过一个 HAProxy 实例时创建 ServicePoint 的 ServicePointManager 可能存在问题,并且由于该对象在应用程序的生命周期内维护,因此通过第二个 HAProxy 实例使用它可能存在一些问题。重新启动应用程序时,ServicePoint 实例将丢失并重新创建。


更新:我注意到 ServicePoint 对象最初具有 HTTP 协议 1.1,但一旦出现问题,它已更改为 1.0。HTTP 1.1 默认有持久连接,而 HTTP 1.0 默认有临时连接。

如果我在一切正常时将 ServicePoint 对象协议更改为 1.0,我将收到 502 Bad Gateway 异常(尽管它似乎已恢复并更改回 1.1 以进行下一个请求)。

我猜云堆栈中的某些东西导致协议在负载平衡后更改为 1.0。

0 投票
0 回答
1405 浏览

c# - System.Net.ServicePointManager.SecurityProtocol 正在使用中

我们有一个 C# 类,服务器和 Web 应用程序都使用它从 3rd 方 Web 服务获取信息。目前,该服务可通过 http 和 https 访问。我们正试图让班级使用 https,因为我们相信第 3 方将来只会允许 https 访问。

这是我们的有效代码:

在您的网站和其他网站上,我们看到提到了 SecurityProtocolType.SystemDefault。根据我的研究,我们想使用它,因为它应该从操作系统中获取安全设置。我们希望我们的服务器管理员来处理这个问题。这样我们将来就不必更改代码。

现在我知道当 .Net 支持 Tls13、Tls14 等时,我们可能需要重新编译和部署类库。但它仍然消除了代码更改。

无论如何,我们的服务器管理员无法让它与 SecurityProtocolType.SystemDefault 设置一起使用。她想知道程序认为当前的安全设置是什么。有什么我无法检查/打印以查看它的内容吗?

0 投票
0 回答
278 浏览

c# - 将 Web 请求绑定到特定的网络适配器

背景

我有一个带有 2 个网络适配器的移动嵌入式设备(Ubuntu/Mono)。一种是WiFi,另一种是GSM。要求是当 WiFi 适配器连接到互联网时(在预定 AP 范围内),应用程序通过 WiFi 上传数据(HTTPS POST),但当 WiFi 不可用但 GSM 可用时,它通过 GSM 链接上传数据。

测试

为了实现这一点,我创建了一个基于云的 Web 服务,如果您向它发出 HTTP GET,它会返回 OK。这个想法是让一个线程定期发出绑定到特定适配器的 GET 请求并检查结果。OK 结果表示适配器已连接到 Internet,而超时通常表示未连接。然后我可以使用它来确定用于请求的适配器。

我创建了一个小型测试应用程序,该应用程序启动一个线程,该线程发出绑定到特定适配器的 GET 请求。我使用 request.BindIPEndPointDelegate 将请求绑定到适配器。当我在 WiFi 适配器上运行应用程序时,结果符合预期。WiFi AP开启时,请求返回OK,AP关闭时,请求超时。当我在 GSM 适配器上运行应用程序时也是如此。

但是,当我更新应用程序以启动 2 个线程,一个用于 WiFi 适配器和 GSM 适配器时,就会出现问题。当 AP 开启时,WiFi 和 GSM 请求正常通过。当我关闭 AP 时,WiFi 请求最初会超时,但一段时间后返回成功结果,这是错误的。因为两个线程的 URI 是相同的,我怀疑 ServicePointManager 向两个线程返回相同的 ServicePoint,并且由于多线程,这会变得混乱。

下一个测试是创建 2 个不同的端点。WiFi 和 GSM 请求各一个,希望 ServicePointManager 总是返回不同的 ServicePoint。不幸的是,这并没有产生积极的影响。

我会很感激建议。

代码如下:

0 投票
1 回答
536 浏览

c# - 我应该在控制台应用程序中设置 ServicePointManager.DefaultConnectionLimit

我在 azure 中作为 webjob 运行的控制台应用程序中调用了这行代码 50000 次:

我是否应该完全关心设置ServicePointManager.DefaultConnectionLimit为默认值以外的任何其他值?

我可以以某种方式查看或计算整个上传平均使用了多少个连接来判断默认值是好的还是我需要增加该值?

0 投票
0 回答
568 浏览

c# - ConnectionManagementElement.MaxConnection 和 ServicePointManager.DefaultConnectionLimit

我试图了解这两个属性是什么ConnectionManagementElement.MaxConnectionServicePointManager.DefaultConnectionLimit用于管理 ASP.net 应用程序的出站连接,以及一个较低的值是否会限制应用程序的所有出站连接。

基于ServicePointManager的 MSDN 信息,该DefaultConnectionLimit属性控制对象允许的最大并发连接数ServicePoint。它说初始值设置为 2,除非它在服务器上运行,然后它是 10,但是只是一个简单的输出值 put 它的实际运行值是 2147483647。MS 框架代码参考在这个 SO 的答案中支持它发布

基于.Net 代码ConnectionManagementElement.MaxConnection,当 web.config 连接管理部分中未定义值时,每个唯一 ip/域 + 端口的默认值设置为 1,但是在机器配置默认值时基于MS 的博客autoConfig = true值为 12 * #cores。在我的情况下是 48 = 12 * 4。似乎没有办法获取配置部分正在设置的属性的运行值,所以我现在假设该值是由什么定义的autoConfig 确定它应该是并且没有其他任何东西可以覆盖它。

有了关于这两个属性的这些细节,它们似乎是完全独立的。然而,发布到asp.net 论坛的一个问题的答案是配置部分设置只是现在设置ServicePointManager.DefaultConnectionLimit值的另一种方法。

设置为 trueConnectionManagementElement.MaxConnection时是否使用 web/machine 配置?autoConfig

如果是这样,是否将atConnectionManagementElement.MaxConnection的值设置为将其设置为global.asax中定义的方法中的代码的同义词?ServicePointManager.DefaultConnectionLimitApplication_Start()Application_Start()

如果没有,是否会根据发起的网络请求ConnectionManagementElement.MaxConnection和控制不同的限制?ServicePointManager.DefaultConnectionLimit

0 投票
2 回答
666 浏览

c# - .NET ServicePoint 对象生命周期

ServicePoint.ConnectionLeaseTimeout当我的 Web API 启动时,我一直在设置该属性,以便使用ServicePointManager.FindServicePoint. 但是,我发现在为 ServicePoint 使用 HTTP 连接后的某个时间,ServicePoint.ConnectionLeaseTimeout它已从我的设置值更改为默认值 -1。我绝对没有ServicePoint.ConnectionLeaseTimeout在我的代码中的任何地方将 -1 设置为 -1,而我配置的其他服务点(尚未用于任何连接)仍处于配置值。因此,我必须假设我最初配置的 ServicePoint 已被处置并替换为ServicePoint.ConnectionLeaseTimeout属性具有默认值的新 ServicePoint 对象。

我知道超过时可以删除ServicePoints ServicePointManager.MaxServicePoints,但在我的应用程序ServicePointManager.MaxServicePoints中设置为0(无限制)。我也知道 ServicePoint 可能会在ServicePointManager.MaxServicePointIdleTime超出后被处置,但我将其设置为 int.MaxValue (~25 天)并且那个时间肯定没有过去。

有没有人知道如何管理 ServicePoint 的生命周期以及如何更好地管理 ServicePoint 的配置(特别是 ConnectionLeaseTimeout),而无需在应用程序启动时简单地找到 ServicePoint 并设置一次?

0 投票
1 回答
553 浏览

.net - 禁用 SSL 验证以在 IronPython 中发布数据

我们最近迁移到了一个新的开发平台。我们仍在为我们的整个工作流程设置一些部分以正常工作。我们有一个问题,我们需要将一个项目提升到生产中,但我们一直在服务器中收到错误。我们的团队并不精通 IronPython 来轻松解决这个问题。

我正在编辑与此相关的脚本。原脚本如下:(请注意我已经编辑/删除了机密和不必要的部分)

新平台的支持告诉我们,为了解决这个问题,我们需要绕过 ssl 验证部分,因为只有在我们工作流的这一部分中,我们才将数据发布到 HTTPS url,因为它是生产的。

我尝试了多种方法,例如添加 ff 代码:

还尝试按照支持人员的建议插入这个:

我也尝试过使用verify = falsessl 库,但仍然不断出现错误。

对于第一个解决方案,我得到的错误是ssl模块似乎无法导入。日志显示module named "ssl" cannot be found".我尝试像其他导入声明一样声明导入的错误:from System.Net import ssl但仍然得到相同的错误。

SecurityProtocolType对于第二种解决方案,即使已成功导入 ServicePointManager ,脚本也无法识别。

我不明白为什么我似乎无法导入 Python 的内置库(ssl)。请理解我发布的脚本是我们唯一可以修改的脚本,因为我们根本无法访问其他脚本。

0 投票
3 回答
1056 浏览

.net - HttpWebRequest 总是发送 TLS 1.0

我正在使用 HttpWebRequest 连接到第 3 方 API,并出现该 API 不支持用于请求的 TLS 版本的故障(“基础连接关闭”)。我检查了 Fiddler 中的请求,发现我的请求正在发送 TLS 1.0。

我已经尝试按照 SO 上许多很多答案中的建议在全局上设置较新的 TLS / SSL 版本ServicePointManager(并尝试了许多不同风格的设置设置),但即使在发出请求之前设置了它,我仍然得到同样的错误,我在 Fiddler 中检查并看到该请求仍在使用 TLS 1.0!就像我尝试使用 ServicePointManager 根本没有任何效果一样。

我提出请求的 DLL 在 .NET 4.6.1 上,并且也在 .NET 4.6.1 上使用 DLL,所以我不认为框架版本是罪魁祸首。

非常感谢任何想法或指导!

0 投票
0 回答
1674 浏览

asp.net-core - System.Net.Http.HttpRequestException:无法建立 SSL 连接,请参阅内部异常

我正在使用 ASP.NET Core 2.2,我在其中使用来自非安全门户的安全 API(例如https://google.com )。但是在请求 API 时出现以下错误:

System.Net.Http.HttpRequestException:无法建立 SSL 连接,请参阅内部异常。

我已经尝试过ServerCertificateCustomValidationCallback,等ServerCertificateCustomValidationCallbackServicePointManager.SecurityProtocol但它没有用。

当我使用时ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;,我收到错误:

System.NotSupportedException:不支持请求的安全协议”

我已经尝试过的示例代码::

1.

2.

3.

0 投票
2 回答
556 浏览

c# - WCF 连接的服务 ServicePointManager.ServerCertificateValidationCallback 未执行

我在我的项目中添加了 WCF 连接服务引用并设置ServicePointManager.ServerCertificateValidationCallback功能。由于某种原因,当我请求服务器时,此回调函数被忽略。如果用户确认,我必须通知用户证书问题并继续请求。