Vb.net ServicePointManager.SecurityProtocol如何影响web请求?
我有一些用vb.net编写的继承代码,它执行以下操作Vb.net ServicePointManager.SecurityProtocol如何影响web请求?,vb.net,http,Vb.net,Http,我有一些用vb.net编写的继承代码,它执行以下操作 创建web请求 从数据库中设置标题等 设置安全协议 发送请求 但是,在设置标头时,它可能会执行另一个web请求,以从第三方API获取令牌,该API递归调用相同的函数 我遇到的问题是头中的调用使用SSL3,而主函数中的调用使用TLS12。如果在检索标头时设置了安全协议,则我无法在第二次更新安全协议。(在主通话中) 应该在什么时候设置安全协议?有没有办法在特定的webrequest上设置它? 请不要建议webrequest已经过时,我在这里使用的
req = HttpWebRequest.Create(Uri)
req.Timeout = HTTPCredentials.Timeout
req.ReadWriteTimeout = HTTPCredentials.Timeout
req.Method = HTTPCredentials.Method
For Each credential As HTTPHeaderCredential In HTTPCredentials.HeaderCredentials
If IsNothing(OldHeader) Then
OldHeader = New HTTPHeaderCredential
OldHeader = credential
End If
If OldHeader.HeaderName = credential.HeaderName Then
'concatenate header
CredentialString += processHeader(credential.HeaderValue, credential.CredentialID, Guid, OptionalParams)
Else
'apply header
If CredentialString <> "" Then
If OldHeader.Validate Then
req.Headers.Add(OldHeader.HeaderName, CredentialString)
Else
priMethod = req.Headers.[GetType]().GetMethod("AddWithoutValidate", BindingFlags.Instance Or BindingFlags.NonPublic)
priMethod.Invoke(req.Headers, {OldHeader.HeaderName, CredentialString})
End If
CredentialString = ""
End If
'new header
CredentialString = processHeader(credential.HeaderValue, credential.CredentialID, Guid, OptionalParams)
OldHeader = credential
End If
Next
'Apply last header
If CredentialString <> "" Then
If OldHeader.Validate Then
req.Headers.Add(OldHeader.HeaderName, CredentialString)
Else
priMethod = req.Headers.[GetType]().GetMethod("AddWithoutValidate", BindingFlags.Instance Or BindingFlags.NonPublic)
priMethod.Invoke(req.Headers, {OldHeader.HeaderName, CredentialString})
End If
End If
If HTTPCredentials.Method = "POST" Then
Select Case HTTPCredentials.ContentType.ToUpper
Case "JSON"
req.ContentType = "application/json"
req.ContentLength = data.Length
req.Accept = "application/json"
Case "XML"
req.ContentType = "application/xml"
req.ContentLength = data.Length
Case "PLAIN TEXT"
If HTTPCredentials.Method.ToUpper = "POST" Then
req.ContentLength = data.Length
End If
End Select
ServicePointManager.SecurityProtocol = HTTPCredentials.SecurityProtocol
stream = req.GetRequestStream()
stream.Write(data, 0, data.Length)
stream.Close()
req=HttpWebRequest.Create(Uri)
req.Timeout=HTTPCredentials.Timeout
req.ReadWriteTimeout=HTTPCredentials.Timeout
req.Method=HTTPCredentials.Method
对于HTTPCredentials.HeaderCredentials中作为HTTPHeaderCredential的每个凭证
如果为Nothing(旧标题),则
OldHeader=新HTTPHeaderCredential
OldHeader=凭证
如果结束
如果OldHeader.HeaderName=credential.HeaderName,则
'连接头
CredentialString+=processHeader(credential.HeaderValue、credential.CredentialID、Guid、OptionalParams)
其他的
'应用标题
如果凭证字符串为“”,则
如果是OldHeader,则验证
请求标题添加(OldHeader.HeaderName,CredentialString)
其他的
priMethod=req.Headers。[GetType]().GetMethod(“AddWithoutValidate”、BindingFlags.Instance或BindingFlags.NonPublic)
调用(req.Headers,{OldHeader.HeaderName,CredentialString})
如果结束
CredentialString=“”
如果结束
'新标题
CredentialString=processHeader(credential.HeaderValue、credential.CredentialID、Guid、OptionalParams)
OldHeader=凭证
如果结束
下一个
'应用最后一个标题
如果凭证字符串为“”,则
如果是OldHeader,则验证
请求标题添加(OldHeader.HeaderName,CredentialString)
其他的
priMethod=req.Headers。[GetType]().GetMethod(“AddWithoutValidate”、BindingFlags.Instance或BindingFlags.NonPublic)
调用(req.Headers,{OldHeader.HeaderName,CredentialString})
如果结束
如果结束
如果HTTPCredentials.Method=“POST”,则
选择案例HTTPCredentials.ContentType.ToUpper
案例“JSON”
req.ContentType=“应用程序/json”
req.ContentLength=数据.Length
req.Accept=“应用程序/json”
案例“XML”
req.ContentType=“应用程序/xml”
req.ContentLength=数据.Length
案例“纯文本”
如果HTTPCredentials.Method.ToUpper=“POST”,则
req.ContentLength=数据.Length
如果结束
结束选择
ServicePointManager.SecurityProtocol=HTTPCredentials.SecurityProtocol
stream=req.GetRequestStream()
stream.Write(数据,0,数据.长度)
stream.Close()
ProcessHeader()可以递归调用此函数来执行令牌的API查找,例如
ServicePointManager
管理ServicePoint
池。当代码询问某个连接时,会将ServicePoint分配给该连接。响应请求时用于创建连接的SecurityProtocol(以及所有其他设置)是当前的ServicePointManager
设置(如果未设置,则为系统默认设置)。您必须在创建新连接之前进行设置。您无法控制连接生成本身。ServicePointManager
可能决定使用现有的一个。如果端点是新的,您可能会收到一个新连接,该连接将使用当前设置。因此,如果您需要特定端点的特定SecurityProtocol,请确保在创建请求之前选择该协议。在连接的生命周期内,对于到同一端点的所有连接,它可能保持不变(请参阅可以指定的两个不同超时)。您可以指定多个SecurityProtocol,握手将尝试协商最佳协议(但您必须依赖此选择)。请参见此处的注释: