Powershell не загружает сборку System.Net.Http и игнорирует Add-Type в скрипте

Я пытаюсь использовать 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.Http и class Wtf : HttpClientHandler {

Я все еще получаю ту же ошибку при попытке запустить ее, но я вообще не вижу своего "Hello World"! Таким образом, кажется, что при его разборе происходит сбой, и он даже не пытается его запустить. ISE по-прежнему отображает ту же ошибку в среде IDE.

Затем, если я запускаю Add-Type -AssemblyName System.Net.Http перед повторным запуском сценария (как из приглашения PowerShell, так и из ISE), все работает без проблем. Также с этого момента ISE IDE intellisense может отображать все в пределах пространства имен 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

person 0xCDCDCDCD    schedule 22.08.2019    source источник
comment
Почему вы не можете добавить тип или использовать сборку в скрипте, который запускает пользователь?   -  person js2010    schedule 22.08.2019
comment
Что касается Add-Type, проблема не в том, что я не хочу его использовать, а в том, что PowerShell его не запускает (или не работает в моем сценарии). Я не знал об использовании сборки до сих пор. Даже при использовании сборки у меня все еще есть ошибка. Увидимся РЕДАКТИРОВАТЬ2.   -  person 0xCDCDCDCD    schedule 22.08.2019


Ответы (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: невозможно найти тип при использовании классов PS 5

РЕДАКТИРОВАТЬ: На самом деле, это работает для меня в PS 6. Если вы используете Windows 10 1809, многие команды снова работают в PS 6.

person js2010    schedule 22.08.2019
comment
Это действительно исправляет [HttpClient]::new(), но не базовый класс. (Кстати: для базового класса я использовал HttpClient, но это должен быть HttpClientHandler, в любом случае в обоих случаях у меня все еще есть проблема с разбором). - person 0xCDCDCDCD; 22.08.2019
comment
Я не понимаю вопроса. Можете ли вы привести пример кода, который не работает, и сообщение об ошибке, которое он приводит? - person js2010; 22.08.2019
comment
Я добавил EDIT2 с текущим примером + результат (ошибка). - person 0xCDCDCDCD; 22.08.2019
comment
Хорошо, я посмотрю на ваше решение stackoverflow, похоже, это моя проблема! Спасибо!. Я ненавижу быть проклятым... мне потребовалось 2 дня, чтобы сделать простой HttpClient; потому что я нашел ошибку с файлами cookie HttpClient, а теперь и в PowerShell... FML - person 0xCDCDCDCD; 22.08.2019

Так как же пользователь может запускать только мой сценарий PowerShell вместо того, чтобы одновременно запускать Add-Type и мой сценарий?

Довольно часто продвинутые сценарии PowerShell начинаются с нескольких операторов using, поэтому вы можете начать свой сценарий так:

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

Но большую часть времени в современной PowerShell, особенно для веб-команд, вы можете и должны начать с использования командлета PowerShell.

Тогда мой вопрос к вам: что вы хотите делать с HttpClient? Дайте мне знать, что вы хотите сделать, и я буду рад показать вам, как это сделать с помощью PowerShell :)

person FoxDeploy    schedule 22.08.2019
comment
Я пытался использовать Invoke-WebRequest, но не могу его использовать: PS5.1 не поддерживает -Authentication и -Form, поэтому мне нужно собрать -Body самостоятельно (мне нужно опубликовать данные формы + файл). К сожалению, вы не можете использовать -Body с -InFile. Я нашел MultipartFormDataContent, но он не поддерживает его как -Body (он отправляет полное пространство имен вместо своего содержимого) - person 0xCDCDCDCD; 22.08.2019