共享的 .NET IWebProxy 在并发请求中安全吗?
区分 IWebProxy 实现的并发约定与自动代理发现导致的延迟。
IWebProxy 描述的是代理策略。它并不为所有实现提供相同的并发保证。在把一个实例共享给多个工作线程任务之前,先确认它具体的实现以及所属的运行时。
该接口暴露了依赖目标地址的路由查询与凭据。自定义实现可能会查询固定地址、可变状态或自动配置。这些选择同时影响安全性与性能。
把配置变更挡在请求处理之外
不要把共享的代理对象当作草稿本:在为作业 A 修改它的地址或凭据时,作业 B 正在选择路由,这会让归属关系变得模糊。请在交给客户端之前配置好策略。对于使用不同代理账户或终结点的负载,请使用各自独立持有的客户端配置。
历史上的 WebProxy 文档并未对实例成员给出线程安全保证。请把这一约定套用到对应的实现上。如果需要同步,每个读取方与写入方都必须参与;包装锁无法协调那些直接使用原对象的调用方。
GetProxy 中的长时间停顿也可能来自发现或 PAC 评估。Microsoft 记录了 WinHTTP 的阻塞式发现行为;当客户端使用该后端时,这一解释成立。请把路由查询时间与连接、响应时间分开测量。把缓慢的查询串行化,可能只是制造出一条队列。
当意图是固定路由时,固定终结点可以消除发现过程。从不断变化的系统策略中捕获单个 URI,也会丢弃它未来的决策。在维护旧代码时保留这一区分;新的 HTTP 工作应使用 HttpClient 及其受支持的处理器配置。