PowerShell无法加载System.Net.Http程序集并忽略脚本中的Add-Type。

7

我正在尝试使用自定义的HttpClientHandler(修复Cookie在重定向时未正确处理的问题)与HttpClient一起使用。

它们都在System.Net.Http程序集(和命名空间)中,但是大部分时间Powershell(和ISE)无法看到这些类(也无法看到该命名空间)。

它确实找到了一个System.Net.Http类(事实上它是WebRequestMethods.Http),我不会感到惊讶如果它会破坏一切。

因此,我创建了这个简单示例:

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中显示相同的错误。

然后,如果我在再次运行脚本之前先运行 Add-Type -AssemblyName System.Net.Http(无论是从PowerShell提示还是ISE),就可以顺利地运行所有内容。从那时起,ISE IDE智能感知可以列出 System.Net.Http 命名空间中的所有内容。

那么,用户如何只启动我的PowerShell脚本而不必运行 Add-Type 和我的脚本呢?

我正在使用PS 5.1在Win10上,并且我对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

为什么用户运行的脚本中不能使用 add-type 或 using assembly? - js2010
关于Add-Type的问题并不是我不想使用它,而是PowerShell无法运行它(或者在我的脚本中无法运行)。我之前不知道可以使用程序集。即使使用程序集,我仍然遇到了错误。 请参见我的EDIT2。 - 0xCDCDCDCD
2个回答

8
# 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:使用PS 5类时无法找到类型

编辑: 实际上,在我的PS 6中可以工作。如果你在Windows 10 1809中,很多命令在PS 6中再次起作用。


它确实修复了[HttpClient] :: new(),但没有修复基类。 (顺便说一句:对于基类,我使用了HttpClient,但应该是HttpClientHandler,无论哪种情况,我仍然有解析问题)。 - 0xCDCDCDCD
我不太了解你的问题。你能否给出一份代码示例,说明什么地方有问题以及产生的错误信息是什么? - js2010
我添加了一个名为“EDIT2”的部分,其中包括当前示例和结果(错误)。 - 0xCDCDCDCD
好的,我会看一下你在stackoverflow上的解决方案,看起来与我的问题非常相似!谢谢!我讨厌被诅咒...因为我发现了一个HttpClient cookie的错误,所以用了两天时间才完成一个简单的HttpClient;现在又遇到了PowerShell的问题...FML。 - 0xCDCDCDCD

4

如何让用户只需运行我的PowerShell脚本,而无需运行Add-Type和我的脚本?

在高级PowerShell脚本中,使用一些using语句是非常常见的。因此,您可以这样开始您的脚本:

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

但是在现代 PowerShell 中,尤其是对于 Web 命令,大多数时候可以并且应该首先使用 PowerShell cmdlet。

那么我的问题是,您想要使用 HttpClient 做什么?请让我知道您想要做什么,我很乐意向您展示“PowerShell”的实现方式 :)


我尝试使用Invoke-WebRequest,但无法使用它:PS5.1不支持-Authentication和-Form,因此我必须自己构建-Body(我需要发布表单数据+文件)。不幸的是,您无法在-InFile中使用-Body。我发现MultipartFormDataContent,但它不支持作为-Body(它发送完整命名空间而不是其内容)。 - 0xCDCDCDCD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接