在PowerShell中使用HttpWebRequest \ Response时的方法调用错误

时间:2018-02-06 22:11:12

标签: powershell httpwebrequest adfs httpwebresponse

我有一个POSH脚本,它执行一组步骤(函数)来实例化对ADFS服务器的请求,使用默认凭据登录到它,解析响应并最终将安全数据发布到/_trust/端点上SharePoint服务器获取FedAuth cookie。

这是为了访问特定的SharePoint站点。

我将省略细节,事实上,该脚本几周前正在运行,现在它向我显示错误:

Method invocation failed because [System.Boolean] does not contain a method named 'GetResponse'.
At XXXXXX.ps1:48 char:5
+     [System.Net.HttpWebResponse]$response = $request.GetResponse()
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

错误输出引用的行如下:

    [System.Net.HttpWebResponse]$response = $request.GetResponse()

脚本的重要部分(负责上述代码)是:

function GetADFSRequest {

    $url =  ($adfsUrl+$wia+"wa="+$wa+'&'+"wtrealm="+$wtrealm+'&'+"wctx="+$wctx+'&'+"wreply="+$wreply)
    $address = New-Object System.Uri($url)
    [System.Net.HttpWebRequest]$request = [System.Net.WebRequest]::Create($address)
    $request.Headers.Add("Accept-Encoding", "gzip, deflate")
    $request.Headers.Add("Accept-Language", "en-US,en;q=0.7,ru;q=0.3")
    $request.Method = "GET"
    $request.Host = $adfsUrl.TrimStart("https://").TrimEnd("/adfs/ls")
    $request.UseDefaultCredentials;

    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

    return $request
}

function GetADFSResponse($request) {

   $request = GetADFSRequest

    [System.Net.HttpWebResponse]$response = $request.GetResponse()
    $reader = New-Object System.IO.StreamReader($response.GetResponseStream())
    $obj = $reader.ReadToEnd()
    $reader.Close() 

当然,像System.WebSystem.Net这样的必需程序集会加载到脚本体中。

我有一个建议,这可能与最近的ADFS服务器升级有关(v.2012到v.2016)但是,我不知道为什么会显示转换\类型转换错误。

通过调试模式检查时,将显示以下内容:

[DBG]: PS C:\temp>> $request | Get-Member


   TypeName: System.Net.HttpWebRequest

Name                                 MemberType Definition                                                                                                               
----                                 ---------- ----------                                                                                                               
Abort                                Method     void Abort()                                                                                                             
AddRange                             Method     void AddRange(int from, int to), void AddRange(long from, long to), void AddRange(int range), void AddRange(long range...

表示使用$request语句正确设置[System.Net.HttpWebRequest]$request类型。

实际上,在$response类型下执行相同检查时会显示错误:

[DBG]: PS C:\temp>> $response | gm
gm : You must specify an object for the Get-Member cmdlet.
At line:1 char:13
+ $response | gm
+             ~~
    + CategoryInfo          : CloseError: (:) [Get-Member], InvalidOperationException
    + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand

这是可以解释的,因为上述错误([System.Boolean],在这种情况下,$request变量没有方法"GetResponse"。)

0 个答案:

没有答案