powershell版本2中的会话变量 - net.httpWebRequest

时间:2017-02-21 09:03:05

标签: .net powershell cookies powershell-v2.0

我目前正致力于使用PowerShell自动化REST调用。我有一个REST API,我使用我的powershell脚本调用Invoke-WebRequest,如下所示。

登录: -

Invoke-WebRequest -Method Post -uri $loginUri -ContentType application/x-www-form-urlencoded -Body $loginBody -Headers @{"Accept" = "application/xml"} -SessionVariable CookieSession -UseBasicParsing

在上面,URL类似于Server / _Login,在正文中,我的凭据作为

传递
$loginBody = "username=$username&password=$password"

我从此调用中获取cookie(JSESSIONID),然后将其解析为所有其他调用。例如

我的退出显示如下: -

Invoke-WebRequest -Method Post -uri $logOutUri -ContentType application/xml -Headers @{"Accept" = "application/xml"} -WebSession $ SessionVariable -UseBasicParsing

其中urL是Server / _Logout并使用-WebSession我正在解析cookie

问题是,我必须使它与powershell版本2兼容,因此必须使用[System.Net.HttpWebRequest]

所以我需要一个首次登录的功能,它会返回sessioncookie,然后我必须解析所有其他调用的cookie。

以下是我的开始,但不知道还有什么: -

function Http-Web-Request([string]$method,[string]$Accept,[string]$contentType, [string]$path,[string]$post)
{



    $url = "$global:restUri/$path"

    $CookieContainer = New-Object System.Net.CookieContainer

    $postData = $post

    $buffer = [text.encoding]::ascii.getbytes($postData)

    [System.Net.HttpWebRequest] $req = [System.Net.HttpWebRequest] [System.Net.WebRequest]::Create($url)
    $req.method = "$method"
    $req.Accept = "$Accept"
    $req.AllowAutoRedirect = $false
    $req.ContentType = "$contentType"
    $req.ContentLength = $buffer.length
    $req.CookieContainer = $CookieContainer
    $req.TimeOut = 50000
    $req.KeepAlive = $true
    $req.Headers.Add("Keep-Alive: 300");
    $reqst = $req.getRequestStream()
    $reqst.write($buffer, 0, $buffer.length)


        try
        {
            [System.Net.HttpWebResponse] $response = $req.GetResponse()  
            $sr = New-Object System.IO.StreamReader($response.GetResponseStream())

            $txt = $sr.ReadToEnd() 
                if ($response.ContentType.StartsWith("text/xml"))
                {
                    ## NOTE: comment out the next line if you don't want this function to print to the terminal
                    Format-XML($txt)
                }



            return $txt


        }

        catch [Net.WebException] 
        { 
            [System.Net.HttpWebResponse] $resp = [System.Net.HttpWebResponse] $_.Exception.Response  
            ## Return the error to the caller
            Throw $resp.StatusDescription
        }

}

1 个答案:

答案 0 :(得分:1)

所以经过大量调查后,我发现了一种方法。

我遇到的问题是我的电话之间的cookie容器丢失了。 .net 中的Cookie容器存储在 $ CookieContainer

我所要做的就是在创建cookie容器时,我必须将其设为 Global

$global:CookieContainer = New-Object System.Net.CookieContainer

然后在我第一次登录Login时,分配与cookie容器相同的

$req.CookieContainer = $CookieContainer

因此,在登录期间,当相同的成功时,您的变量$ cookiecontainer与值一起存储,并且对Rest的所有以下调用都具有相同的cookie容器

  

$ req.CookieContainer = $ CookieContainer

您可以继续使用,直到您关闭会话。