当 WinHTTP 在 407 与 401 之间交替时
保留已选定的代理身份验证状态,并在重试前重新应用,同时单独处理目标站点发起的新一轮质询。
一次 WinHTTP 请求先向代理完成身份验证,随后收到网站返回的 401,在下一次发送时又收到一个 407。代理与网站各自维护独立的身份验证状态,重发路径必须同时保留这两份状态。
微软官方的 WinHTTP 身份验证示例把选定的代理方案保存在一个变量中,并在该方案确定之后,于每次 WinHttpSendRequest 之前重新应用代理账户。
- 发送请求并检查响应。
- 遇到 407 时,查询服务器提供的方案,并记住选定的代理方案。
- 重发之前,用该方案和账户为 WINHTTP_AUTH_TARGET_PROXY 调用 WinHttpSetCredentials。
- 遇到目标站点返回的 401 时,取得它的方案并设置服务器凭据,同时保留已记住的代理状态供下一次发送使用。
示例特别指出,在服务器质询或重定向之后需要重新验证,这正是要再次应用代理凭据的原因。如果只在第一个 407 分支中调用,另一条重试路径就会缺少预期的设置。
检查每一个 API 结果,并限制重复失败的次数。微软的紧凑示例只跟踪上一次的状态,而生产环境的重试策略还应识别反复出现的交替序列。
如果用户在失败后提供了替换账户,请更新该重发路径所使用的值。WinHttpSetCredentials 的作用范围是单次请求,它并不是进程级密码库,不会为之后所有请求替换其中的内容。