Войти

Показать полную графическую версию : [решено] Set wsdl resonse type


Wheee111
11-07-2018, 00:49
Здравствуйте!
Столкнулся со следующей проблемой:

Есть 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 в поисках ответа.

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

Wheee111
18-07-2018, 10:41
Была ошибка в формате ответа. там получился xml внутри soap.
Решение или парсить xml и работать через invoke-WebRequest пересобирая xml запроса\ответа или исправить формат ответа на стороне сервиса.




© OSzone.net 2001-2012