Ошибка в командлете New-WebServiceProxy при использовании -Namespace? - PullRequest
12 голосов
/ 05 января 2012

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

Суть проблемы заключается в том, что при использовании командлета New-WebServiceProxy AND параметр -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 в этом сценарии.Кто-нибудь может пролить свет на это для меня?

Ответы [ 2 ]

8 голосов
/ 09 января 2012

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

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

Есть два пути решения этой проблемы:

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

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

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

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

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

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

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

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

3 голосов
/ 06 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...