Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net ServicePointManager.SecurityProtocol如何影响web请求?_Vb.net_Http - Fatal编程技术网

Vb.net ServicePointManager.SecurityProtocol如何影响web请求?

Vb.net ServicePointManager.SecurityProtocol如何影响web请求?,vb.net,http,Vb.net,Http,我有一些用vb.net编写的继承代码,它执行以下操作 创建web请求 从数据库中设置标题等 设置安全协议 发送请求 但是,在设置标头时,它可能会执行另一个web请求,以从第三方API获取令牌,该API递归调用相同的函数 我遇到的问题是头中的调用使用SSL3,而主函数中的调用使用TLS12。如果在检索标头时设置了安全协议,则我无法在第二次更新安全协议。(在主通话中) 应该在什么时候设置安全协议?有没有办法在特定的webrequest上设置它? 请不要建议webrequest已经过时,我在这里使用的

我有一些用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,握手将尝试协商最佳协议(但您必须依赖此选择)。请参见此处的注释: