Powershell不会加载System.Net.Http程序集,并且会忽略脚本中的Add-Type

时间:2019-08-22 02:12:07

标签: powershell powershell-5.0

我正在尝试将HttpClient与自定义HttpClientHandler配合使用(以解决Cookie的问题,该问题无法通过重定向正确解决。)

两者都进入System.Net.Http程序集(和名称空间)中,而Powershell(和ISE)在大多数时间都看不到类(也没有名称空间)。

它确实找到了一个类System.Net.Http(实际上是WebRequestMethods.Http),我不会惊讶地破坏了所有内容。

所以我创建了这个KISS示例:

using namespace System.Net.Http

class Wtf : HttpClientHandler {
}

$t = [HttpClient]::new()

如果我运行它,它将告诉我该类型不存在。 (如果我使用完整的命名空间而不是using也是如此)。

有趣的是接下来是什么。 如果我在ISE中使用相同的代码,则IDE只会告诉我找不到基类HttpClient。 (与实例无关)

我发现Add-Type在这里可以为我提供帮助,因此我添加了

Add-Type -AssemblyName System.Net.Http

Write-Host "Hello World"

using namespace System.Net.Httpclass Wtf : HttpClientHandler {之间

尝试运行该错误时我仍然遇到相同的错误-但我根本看不到我的"Hello World"! 因此,它在解析时似乎失败了,甚至没有尝试运行它。 ISE在IDE中仍然显示相同的错误。

然后,如果我在再次运行脚本之前(无论是从PowerShell提示符还是ISE)运行Add-Type -AssemblyName System.Net.Http,一切都会正常运行。 同样从那时起,ISE IDE的智能感知功能就可以列出System.Net.Http名称空间中的所有内容。

那么用户如何才能仅启动我的PowerShell脚本,而不必同时运行Add-Type和我的脚本?

我在Win10上使用PS 5.1,并且在PowerShell环境中是新手,尽管我确实具有C#背景。

EDIT1 :使用HttpClientHandler而不是HttpClient(但无论问题是什么)

EDIT2 : 这是我现在正在使用的东西

using assembly System.Net.Http
using namespace System.Net.Http

class Test : HttpClient {
}

[HttpClient]::new()

以下是输出:

Au caractère C:\Users\0xdcdcdcd\Desktop\Test.ps1:4 : 14
+ class Test : HttpClient {
+              ~~~~~~~~~~
Type [HttpClient] introuvable.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TypeNotFound

2 个答案:

答案 0 :(得分:2)

# test.ps1
Add-Type -AssemblyName System.Net.Http

class Test : system.Net.Http.HttpClient {
}


At C:\users\admin\test.ps1:3 char:14
+ class Test : system.Net.Http.HttpClient {
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~
Unable to find type [system.Net.Http.HttpClient].
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : TypeNotFound

我现在明白了。不能在脚本中运行很疯狂。我相信这里提供了一些解决方案:Powershell: Unable to find type when using PS 5 classes

编辑: 实际上,这在PS 6中对我有效。如果您在Windows 10 1809中,则许多命令在PS 6中也可以再次工作。

答案 1 :(得分:0)

  

那么用户如何才能仅启动我的PowerShell脚本,而不必同时运行Add-Type和我的脚本?

看到高级PowerShell脚本以一些using语句开头很常见,因此您可以像这样开始脚本:

using assembly System.Net.Http
using namespace System.Net.Http
#your code here

但是在大​​多数现代PowerShell中,尤其是对于Web命令,您可以并且应该从使用PowerShell cmdlet开始。

然后我对您的问题是,您打算如何使用HttpClient?让我知道您想做什么,我将很乐意向您展示“ PowerShell”的实现方法:)