2014-09-17 3 views
1

У меня есть простой веб-служба 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 

ответ

3

Просто измените эту строку:

$person = new-object ("com.abhi.Proxy.Person") 

к этому :

$person = new-object ("com.abhi.Person") 

Параметр -Namespace определяет пространство имен, где будут создаваться типы из WSDL, так что если ваш WSDL объявляет Person типа, он будет доступен в этом пространстве имен. Аргумент -Class указывает имя класса прокси, по умолчанию "MyClass" + random (аналогично пространству имен). Обычно вы не относитесь к классу прокси или его имени, поэтому вы можете оставить его по умолчанию, просто не указывая это имя, это может быть действительно любое допустимое имя класса, но вам нужно указать его вдоль с -Namespace.

Полный демонстрационный вызов из PowerShell:

$proxy = New-WebServiceProxy -uri "http://localhost:57633/WebSite1/Service.asmx?WSDL" -namespace "com.example" -class "MyProxyClass" 

$person = New-Object "com.example.Person"; 
$person.FirstName = "MyFirstName"; 
$person.LastName = "MyLastName"; 

$proxy.HelloWorld($person); 
+0

все еще получил ошибку 'Невозможно преобразовать аргумент« 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' –

+0

Хорошо, я создал новый веб-сервис на основе вашего кода, и он сработал. Я редактирую свой ответ, чтобы включить полную часть PowerShell, может быть, вы заметите какую-то разницу с вашим кодом? Для чего это стоит, я использую PowerShell 4.0 от ISE. – PeterK

+0

На самом деле, после изучения этой темы далее я нашел несколько подсказок к ошибке (?): Когда вы указываете '-Namespace', но опускаете' -Class', 'New-WebServiceProxy' будет генерировать случайный прокси-класс, поэтому, когда вы повторно запускаете код, пространство имен будет загрязнено несколькими объявлениями того же класса 'Person'. Когда вы также укажете имя класса, декларация будет правильно заменена. Я редактирую свой ответ с учетом этого. – PeterK

0

Я решил проблему, хотя в кривом пути.

Приведенный выше подход продолжал давать мне ошибки. так что я сделал, так это то, что я создал метод в своем веб-сервисе, например

[WebMethod] 
[ScriptMethod(UseHttpGet=true)] 
public Person GetEmptyPerson() { 
    return new Person(); 
} 

Теперь вместо вызова нового в моем клиентском коде. Я просто вызываю этот метод и получаю объект Person. это работает, но включает в себя еще одну дополнительную поездку на сервер.

В любом случае. мой код не требует высокой производительности, поэтому накладные расходы на один дополнительный вызов прекрасны.

Смежные вопросы