Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Set wsdl resonse type

Ответить
Настройки темы
PowerShell - [решено] Set wsdl resonse type

Новый участник


Сообщения: 31
Благодарности: 4

Профиль | Отправить PM | Цитировать


Здравствуйте!
Столкнулся со следующей проблемой:

Есть wsdl сервис (на базе 1С, если это важно), разумеется с методами и типами.
При вызове одного из методов возвращается ответ не указанного ранее типа, что приводит к ошибке обработки ответа.

Подключаюсь и вызывают метод следующим образом:
Объявление сервиса и вызов метода

Код: Выделить весь код
$WsdlLink = "http://$SrvName/$DBName/WS/$PageName.1cws?wsdl"
$Service = New-WebServiceProxy -Uri $WsdlLink

$Type = $Service.GetType().Namespace
$FindingObjectComplexType = New-Object ($Type + '.Object')
$ChangingObjectComplexType = New-Object ($Type + '.Object')

$FindingObjectComplexType.Identity = "ObjectIdentity_XXX"
$ChangingObjectComplexType.Value = "Value_YYY"

$Service.SetObject($FindingObjectComplexType, $ChangingObjectComplexType)

После выполнения сервис возвращает код ошибки в формате объекта ( $Type + '.SetResult' ), но т.к. этот тип в контексте выполнения не известен, то по результату выполнения метода "SetObject" имею следующую ошибку:
Ошибка

Exception:
System.Management.Automation.MethodInvocationException:
Exception calling "SetObject" with "2" argument(s): "There is an error in XML document (4, 5)." --->
System.InvalidOperationException:
There is an error in XML document (4, 5) .
---> System.InvalidOperationException:
The specified type was not recognized:
name='ChekResult',
namespace='http://contoso.com',
at <return xmlns='http://contoso.com'>.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderObjects.Read7_SetResult(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderObjects.Read8_SetObjectResponse( )
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at Microsoft.PowerShell.Commands.NewWebserviceProxy.AutogeneratedTypes.WebServiceProxy$PartOfType.Objec ts.SetObject(Object Property_1, Object Property_2)
at CallSite.Target(Closure , CallSite , Object , Object , Object )
--- End of inner exception stack trace ---
at System.Management.Automation.ExceptionHandlingOps.ConvertToMethodInvocationException(Exception exception, Type typeToThrow, String methodName, Int32 numArgs, MemberInfo memberInfo)
at CallSite.Target(Closure , CallSite , Object , Object , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
at System.Management.Automation.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)
at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
TargetObject :
CategoryInfo : NotSpecified: ( : ) [], MethodInvocationException
FullyQualifiedErrorId : InvalidOperationException

Если смотреть на http запрос\ответ, то имеем следующее:
Запрос:

POST /$DBName/WS/Objects.1cws HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 4.0.30319.42000)
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://contoso.com#Objects:SetObject"
Authorization: Basic AAAAAAAAAAAAAAAAA==
Host: $SrvName
Content-Length: 801
Expect: 100-continue

HTTP/1.1 100 Continue

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<SetObject xmlns="http://contoso.com">
<FindingObject>
<Identity>ObjectIdentity_XXX</Identity>
<Value />
</FindingObject>
<ChangingObjectData>
<Identity />
<Value>Value_YYY</Value>
</ChangingObjectData>
</SetObject>
</soap:Body>
</soap:Envelope>

Ответ:

HTTP/1.1 200 OK
Content-Type: text/xml;charset=utf-8
Server: Microsoft-IIS/8.5
X-Powered-By: ASP.NET
Date: Tue, 01 Jan 2000 00:01:02 GMT
Content-Length: 392

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:SetObjectResponse xmlns:m="http://contoso.com">
<m:return xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="m:ChekResult">
<m:Code>0</m:Code>
</m:return>
</m:SetObjectResponse>
</soap:Body>
</soap:Envelope>

Тут явно видно, что отправлял я два параметра типа ($Type + '.Object') , а в результате выполнения получаю объект типа ($Type + '.SetResult')

PS C:\> New-Object ($Type + '.SetResult') | FL
Code : 0
ErrorDescription :

Собственно, как получать в данном случае корректно код результата работы сервера, а не парсить содержимое ErrorVariable в поисках ответа.

(очень надеюсь, что описал понятно. и не сильно напутал в терминах)

Отправлено: 00:49, 11-07-2018

 

Новый участник


Сообщения: 31
Благодарности: 4

Профиль | Отправить PM | Цитировать


Была ошибка в формате ответа. там получился xml внутри soap.
Решение или парсить xml и работать через invoke-WebRequest пересобирая xml запроса\ответа или исправить формат ответа на стороне сервиса.

Последний раз редактировалось Wheee111, 22-07-2018 в 21:41. Причина: Чуть подробнее расписал ошибку. Аналогов в русском сегменте интернета не нашел.


Отправлено: 10:41, 18-07-2018 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Set wsdl resonse type

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - Альтернатива Add-Type jkadaba Скриптовые языки администрирования Windows 4 04-09-2016 13:33
Интерфейс - Clear Type в Windows 8 Кукулькан Microsoft Windows 8 и 8.1 7 15-12-2014 16:02
Type Pilot 2.8.3 OSZone Software Новости программного обеспечения 0 01-07-2011 19:30
set temp в формате8 akpar Microsoft Windows 2000/XP 2 04-11-2006 13:59
Переместить Doc-s and Set-s kirillkr Автоматическая установка Windows 2000/XP/2003 3 20-03-2005 19:06




 
Переход