Подтвердить что ты не робот

Ошибка в командлете New-WebServiceProxy при использовании -Namespace?

Итак, я столкнулся с этой точной проблемой: http://www.vistax64.com/powershell/273120-bug-when-using-namespace-parameter-new-webserviceproxy.html

Суть проблемы заключается в том, что при использовании командлета New-WebServiceProxy И параметра -Namspace вы не можете выполнить метод в прокси с аргументом автогенерируемого типа.

Что-то вроде этого:

// In the service
public void DoSomething(DoSomethingRequest request) { ... }


$proxy = New-WebServiceProxy -Uri "http://something.com/MyService.svc" 
          -Namespace ns 
$req = New-Object ns.DoSomethingRequest
$proxy.DoSomething($req)

Это генерирует исключение по строкам Cannot convert argument "0" of type "ns.DoSomething" to type "ns.DoSomething"

Как объясняется в ссылке, путем удаления параметра -Namespace и использования автогенерированного пространства имен все работает нормально. Тем не менее, я бы очень хотел использовать -Namespace....

Я не могу найти ничего связанного с "исправлением" или правильным способом использования -Namespace в этом сценарии. Может ли кто-нибудь пролить свет на это для меня?

4b9b3361

Ответ 1

Вы используете свой код в каком-то редакторе? У меня была аналогичная проблема при запуске script из редактора PowerGUI, но он отлично работает для меня, когда я запускаю его с консоли. Попробуйте закрыть все свои материалы, связанные с powershell, и откройте его снова.

Ответ 2

На самом деле вы видите нечто более заметное. С -Namespace вы не можете дважды выполнить аргумент типа в пространстве имен

Я подозреваю, что вы создаете New-WebServiceProxy много, например, в блоке процесса функции или внутри команды, которая вызывалась многократно. Каждый раз, когда вы его вызываете, он пытается регенерировать, и с помощью -Namespace это оставляет небольшие конфликты со связанными типами в AppDomain. В результате их несколько, и вы получите эту ошибку.

Существует два способа:

  • Удостоверьтесь, что он импортирован один раз и только один раз для AppDomain. В чем-то вроде PowerGUI или ISE это может быть сложнее, чем кажется, потому что не только есть пробелы, о которых вы думаете (например, открытые вкладки), но есть пробелы, которые у вас нет (например, те, которые активируются добавлением или в процессе работы)
  • Далекое "проще", но значительно более загадочное обходное решение - это просто создавать типы по отношению к определенному пространству имен.

Это гораздо проще показать, чем сказать.

У меня была эта проблема с модулем, который у меня есть для Office365/Exchange Web Services, и, под обложками, он имеет что-то вроде:

$createItemType = 
   New-Object "$script:ExchangeWebServiceNamespace.CreateItemType" 
-Property @{
 MessageDisposition = $messageDisposition
 MessageDispositionSpecified  = $true
 Items = 
    New-Object "$script:ExchangeWebServiceNamespace.NonEmptyArrayOfAllItemsType"
}

Это, очевидно, немного загадочно, но, ну, так же как и Web-службы Exchange. И так много веб-сервисов, которые построены непосредственно из сложных объектных моделей.

К сожалению, это подавляющее большинство веб-сервисов, с которыми работает New-WebServiceProxy.

Имейте в виду, что по-прежнему хорошая практика кэшировать объект веб-службы, который вы создаете в своем модуле (используя $script:variablename, как указано выше), но этот странный трюк, чтобы ссылаться на части веб-сервиса прокси-объектом, спас меня больше времени, чем Я бы хотел.

Надеюсь, что это поможет