Ошибка в командлете 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 в этом сценарии. Может ли кто-нибудь пролить свет на это для меня?
Ответы
Ответ 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
, как указано выше), но этот странный трюк, чтобы ссылаться на части веб-сервиса прокси-объектом, спас меня больше времени, чем Я бы хотел.
Надеюсь, что это поможет