【问题标题】:Powershell doesn't load System.Net.Http assembly and ignore Add-Type within scriptPowershell 不加载 System.Net.Http 程序集并忽略脚本中的 Add-Type
【发布时间】:2019-08-22 02:12:07
【问题描述】:

我正在尝试将 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 中仍然显示相同的错误。

然后,如果我在再次运行脚本之前运行 Add-Type -AssemblyName System.Net.Http(无论是从 PowerShell 提示符还是从 ISE),一切都会正常运行。 同样从那时起,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

【问题讨论】:

  • 为什么在用户运行的脚本中不能有 add-type 或者 using assembly?
  • 至于 Add-Type 的问题不是我不想使用它,而是 PowerShell 没有运行它(或者在我的脚本中没有运行)。直到现在我才知道使用汇编。即使使用程序集,我仍然有错误。见我EDIT2。

标签: powershell powershell-5.0


【解决方案1】:
# 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 中再次起作用。

【讨论】:

  • 它确实修复了[HttpClient]::new(),但没有修复基类。 (顺便说一句:对于我使用 HttpClient 的基类,但它应该是 HttpClientHandler,无论如何我仍然有解析问题)。
  • 我不明白这个问题。你能举一个不起作用的代码示例,以及它导致的错误消息吗?
  • 我在当前示例 + 结果(错误)中添加了“EDIT2”。
  • 好的,我会看看你的 stackoverflow 解决方案,这似乎是我的问题!谢谢!。我讨厌被诅咒……我花了 2 天时间做了一个简单的 HttpClient;因为我发现了一个 HttpClient cookie 的错误,现在在 PowerShell 中... FML
【解决方案2】:

那么用户如何只启动我的 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(我需要发布 form-数据+文件)。不幸的是,您不能将 -Body 与 -InFile 一起使用。我找到了 MultipartFormDataContent 但它不支持它作为 -Body (它发送完整的命名空间而不是他的内容)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2020-07-14
  • 2018-04-19
相关资源
最近更新 更多