У меня есть простой веб-служба ASMXВызова ASMX из Powershell
public class WebService1 : System.Web.Services.WebService {
[WebMethod]
[ScriptMethod(UseHttpGet=true)]
public string HelloWorld(Person person) {
return "Hello World " + person.FirstName + " " + person.LastName;
}
}
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
Я называю это из PowerShell, как
cls
$proxy = New-WebServiceProxy -Uri 'http://localhost:10875/WebService1.asmx' -UseDefaultCredential
$person = new-object ("Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy1calhost_10875_WebService1_asmx.Person")
$person.FirstName = "foo"
$person.LastName = "bar"
$s = $proxy.HelloWorld($person)
Write-Host $s
Но мне не нравится забавное пространство имен для того, чтобы получить доступ к Person класс.
Есть ли лучший способ доступа к классу Person, не используя что-то смешное, как WebServiceProxy1calhost_10875_WebService1_asmx?
Могу ли я узнать класс Person из объекта $ proxy?
Edit:
Я изменил свой Powershell код
$proxy = New-WebServiceProxy -Uri 'http://localhost:10875/WebService1.asmx' -Namespace "com.abhi" -Class "Proxy" -UseDefaultCredential
$proxy | get-member -type method
$person = new-object ("com.abhi.Proxy.Person")
$person.FirstName = "foo"
$person.LastName = "bar"
$s = $proxy.HelloWorld($person)
Write-Host $s
, но теперь я получаю сообщение об ошибке
New-Object : Cannot find type [com.abhi.Proxy.Person]: make sure the assembly containing this type is load
ed.
At C:\Users\srabhi_adm\Documents\SP2010InfobarrierException.ps1:6 char:21
+ $person = new-object <<<< ("com.abhi.Proxy.Person")
+ CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
Property 'FirstName' cannot be found on this object; make sure it exists and is settable.
At C:\Users\srabhi_adm\Documents\SP2010InfobarrierException.ps1:7 char:9
+ $person. <<<< FirstName = "foo"
+ CategoryInfo : InvalidOperation: (FirstName:String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
Property 'LastName' cannot be found on this object; make sure it exists and is settable.
At C:\Users\srabhi_adm\Documents\SP2010InfobarrierException.ps1:8 char:9
+ $person. <<<< LastName = "bar"
+ CategoryInfo : InvalidOperation: (LastName:String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
Exception calling "HelloWorld" with "1" argument(s): "System.Web.Services.Protocols.SoapException: Server
was unable to process request. ---> System.NullReferenceException: Object reference not set to an instance
of an object.
at SP2010InfobarrierExceptions.WebService1.HelloWorld(Person person) in c:\users\srabhi_adm\documents\v
isual studio 2010\Projects\SP2010InfobarrierExceptions\SP2010InfobarrierExceptions\WebService1.asmx.cs:lin
e 22
--- End of inner exception stack trace ---"
At C:\Users\srabhi_adm\Documents\SP2010InfobarrierException.ps1:10 char:23
+ $s = $proxy.HelloWorld <<<< ($person)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
все еще получил ошибку 'Невозможно преобразовать аргумент« 0 »со значением:« com.abhi.Person », для« HelloWorld »набрать« com.abhi.Person »:« C annot конвертировать «com.abhi» .Person "значение типа" com.abhi.Person ", чтобы напечатать" com.abhi.Person "." В C: \ Users \ srabhi_adm \ Documents \ SP2010InfobarrierException.ps1: 10 char: 23 + $ s = $ proxy.HelloWorld <<<< ($ person) + CategoryInfo: NotSpecified: (:) [], MethodException + FullyQualifiedErrorId: MethodArgumentConversionInvalidCastArgument' –
Хорошо, я создал новый веб-сервис на основе вашего кода, и он сработал. Я редактирую свой ответ, чтобы включить полную часть PowerShell, может быть, вы заметите какую-то разницу с вашим кодом? Для чего это стоит, я использую PowerShell 4.0 от ISE. – PeterK
На самом деле, после изучения этой темы далее я нашел несколько подсказок к ошибке (?): Когда вы указываете '-Namespace', но опускаете' -Class', 'New-WebServiceProxy' будет генерировать случайный прокси-класс, поэтому, когда вы повторно запускаете код, пространство имен будет загрязнено несколькими объявлениями того же класса 'Person'. Когда вы также укажете имя класса, декларация будет правильно заменена. Я редактирую свой ответ с учетом этого. – PeterK