Web service request request. SOAP request missing empty parameters.

I am new to web services and C #, so please forgive me if my question is too simple. I searched around but can't find an answer - at least one based on my keywords.

I am trying to call a web service through C # (Visual Web Developer 2010 Express), but I am getting an error in response. When I call the same web service through soapUI, I do not get an error. When I compare a SOAP request with C # with a SOAP request with soapUI, there is no intentionally empty <aclObjectId> parameter in the SOAP SOA request. When I take an empty parameter from soapUI request, I get the same error. For me, the answer is to get C # to send the parameter, even if it is empty. I tried this by setting it to null or "", but to no avail. Is there a way to get my C # web service client to send an empty parameter, or maybe send all the parameters even if they don't matter?

Wsdl

 <?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI version is JAX-WS RI 2.1.3-b02-. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI version is JAX-WS RI 2.1.3-b02-. --><definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://search.services.redacted/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://search.services.redacted/" name="EDRSearchServiceSOAPImplService"> <types> <xsd:schema> <xsd:import namespace="http://search.services.redacted/" schemaLocation="http://wwwdev.redacted:80/EDRSearch?xsd=1"></xsd:import> </xsd:schema> </types> <message name="processSearch"> <part name="parameters" element="tns:processSearch"></part> </message> <message name="processSearchResponse"> <part name="parameters" element="tns:processSearchResponse"></part> </message> <message name="getAttributes"> <part name="parameters" element="tns:getAttributes"></part> </message> <message name="getAttributesResponse"> <part name="parameters" element="tns:getAttributesResponse"></part> </message> <message name="getACLUsers"> <part name="parameters" element="tns:getACLUsers"></part> </message> <message name="getACLUsersResponse"> <part name="parameters" element="tns:getACLUsersResponse"></part> </message> <portType name="EDRSearchServiceSOAPImpl"> <operation name="processSearch"> <input message="tns:processSearch"></input> <output message="tns:processSearchResponse"></output> </operation> <operation name="getAttributes"> <input message="tns:getAttributes"></input> <output message="tns:getAttributesResponse"></output> </operation> <operation name="getACLUsers"> <input message="tns:getACLUsers"></input> <output message="tns:getACLUsersResponse"></output> </operation> </portType> <binding name="EDRSearchServiceSOAPImplPortBinding" type="tns:EDRSearchServiceSOAPImpl"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"></soap:binding> <operation name="processSearch"> <soap:operation soapAction=""></soap:operation> <input> <soap:body use="literal"></soap:body> </input> <output> <soap:body use="literal"></soap:body> </output> </operation> <operation name="getAttributes"> <soap:operation soapAction=""></soap:operation> <input> <soap:body use="literal"></soap:body> </input> <output> <soap:body use="literal"></soap:body> </output> </operation> <operation name="getACLUsers"> <soap:operation soapAction=""></soap:operation> <input> <soap:body use="literal"></soap:body> </input> <output> <soap:body use="literal"></soap:body> </output> </operation> </binding> <service name="EDRSearchServiceSOAPImplService"> <port name="EDRSearchServiceSOAPImplPort" binding="tns:EDRSearchServiceSOAPImplPortBinding"> <soap:address location="http://wwwdev.redacted:80/EDRSearch"></soap:address> </port> </service> </definitions> 

C # SOAP (not working)

 <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <getACLUsers xmlns="http://search.services.redacted/"> <ACLUsersRequest xmlns=""> <docbase>edmsdev</docbase> <aclName>my_acl</aclName> </ACLUsersRequest> <userCredentials xmlns=""> <userName>spoonyfork</userName> <password>my_password</password> <docbase>edmsdev</docbase> </userCredentials> </getACLUsers> </s:Body> </s:Envelope> 

soapUI SOAP (works)

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sear="http://search.services.redacted/"> <soapenv:Header/> <soapenv:Body> <sear:getACLUsers> <!--Optional:--> <ACLUsersRequest> <docbase>edmsdev</docbase> <aclName>my_acl</aclName> <aclObjectId></aclObjectId> </ACLUsersRequest> <!--Optional:--> <userCredentials> <userName>spoonyfork</userName> <!--Optional:--> <password>my_password</password> <!--Optional:--> <wsl4cookie></wsl4cookie> <!--Optional:--> <endUserForProxyId></endUserForProxyId> <!--Optional:--> <ip></ip> <!--Optional:--> <docbase>edmsdev</docbase> </userCredentials> </sear:getACLUsers> </soapenv:Body> </soapenv:Envelope> 

EDRSearch XSD

 <?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI version is JAX-WS RI 2.1.3-b02-. --><xs:schema xmlns:tns="http://search.services.redacted/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://search.services.redacted/"> <xs:element name="getACLUsers" type="tns:getACLUsers"></xs:element> <xs:element name="getACLUsersResponse" type="tns:getACLUsersResponse"></xs:element> <xs:element name="getAttributes" type="tns:getAttributes"></xs:element> <xs:element name="getAttributesResponse" type="tns:getAttributesResponse"></xs:element> <xs:element name="processSearch" type="tns:processSearch"></xs:element> <xs:element name="processSearchResponse" type="tns:processSearchResponse"></xs:element> <xs:complexType name="getACLUsers"> <xs:sequence> <xs:element name="ACLUsersRequest" type="tns:ACLUsersRequest" minOccurs="0"></xs:element> <xs:element name="userCredentials" type="tns:UserCredentials" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="ACLUsersRequest"> <xs:sequence> <xs:element name="docbase" type="xs:string"></xs:element> <xs:element name="aclName" type="xs:string"></xs:element> <xs:element name="aclObjectId" type="xs:string"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="UserCredentials"> <xs:sequence> <xs:element name="userName" type="xs:string"></xs:element> <xs:element name="password" type="xs:string" minOccurs="0"></xs:element> <xs:element name="wsl4cookie" type="xs:string" minOccurs="0"></xs:element> <xs:element name="endUserForProxyId" type="xs:string" minOccurs="0"></xs:element> <xs:element name="ip" type="xs:string" minOccurs="0"></xs:element> <xs:element name="docbase" type="xs:string" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="getACLUsersResponse"> <xs:sequence> <xs:element name="return" type="tns:ACLUsersResponse" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="ACLUsersResponse"> <xs:sequence> <xs:element name="user" type="xs:string" maxOccurs="unbounded"></xs:element> <xs:element name="largeGroups" type="xs:string" maxOccurs="unbounded"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="processSearch"> <xs:sequence> <xs:element name="searchRequest" type="tns:searchRequest" minOccurs="0"></xs:element> <xs:element name="userCredentials" type="tns:UserCredentials" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="searchRequest"> <xs:sequence> <xs:element name="version" type="xs:string"></xs:element> <xs:element name="docbase" type="xs:string"></xs:element> <xs:element name="searchCriteria" type="tns:logicalOp" maxOccurs="unbounded"></xs:element> <xs:element name="maxNumberOfDocuments" type="xs:string"></xs:element> <xs:element name="folderPaths" type="xs:string" maxOccurs="unbounded"></xs:element> <xs:element name="metaDataList" type="xs:string" maxOccurs="unbounded"></xs:element> <xs:element name="objectType" type="xs:string"></xs:element> <xs:element name="documentLaunchSettings" type="tns:documentLaunchSettings"></xs:element> <xs:element name="documentACLSettings" type="tns:documentACLSettings"></xs:element> <xs:element name="oracleHint" type="xs:string" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="logicalOp"> <xs:sequence> <xs:element name="type" type="xs:string"></xs:element> <xs:element name="name" type="xs:string"></xs:element> <xs:element name="value" type="xs:string"></xs:element> <xs:element name="logical" type="xs:string"></xs:element> <xs:element name="relational" type="xs:string"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="documentLaunchSettings"> <xs:sequence> <xs:element name="launcher" type="xs:string"></xs:element> <xs:element name="useChronicleId" type="xs:boolean"></xs:element> <xs:element name="showLink" type="xs:boolean"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="documentACLSettings"> <xs:sequence> <xs:element name="returnACL" type="xs:boolean"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="processSearchResponse"> <xs:sequence> <xs:element name="return" type="tns:searchResponse" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="searchResponse"> <xs:sequence> <xs:element name="docbase" type="xs:string" minOccurs="0"></xs:element> <xs:element name="documents" type="tns:document" nillable="true" minOccurs="0" maxOccurs="unbounded"></xs:element> <xs:element name="numberOfDocuments" type="xs:string" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="document"> <xs:sequence> <xs:element name="objectId" type="xs:string"></xs:element> <xs:element name="linkLocation" type="xs:string"></xs:element> <xs:element name="metaDataList" type="tns:metaDataItem" maxOccurs="unbounded"></xs:element> <xs:element name="aclInfo" type="tns:ACLInfo" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="metaDataItem"> <xs:sequence> <xs:element name="name" type="xs:string"></xs:element> <xs:element name="value" type="xs:string"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="ACLInfo"> <xs:sequence> <xs:element name="ACLName" type="xs:string"></xs:element> <xs:element name="ACLObjectId" type="xs:string"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="getAttributes"> <xs:sequence> <xs:element name="attributesRequest" type="tns:objectType" minOccurs="0"></xs:element> <xs:element name="userCredentials" type="tns:UserCredentials" minOccurs="0"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="objectType"> <xs:sequence> <xs:element name="docbase" type="xs:string"></xs:element> <xs:element name="objectType" type="xs:string"></xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="getAttributesResponse"> <xs:sequence> <xs:element name="return" type="xs:string" minOccurs="0" maxOccurs="unbounded"></xs:element> </xs:sequence> </xs:complexType> </xs:schema> 

C # code

 ServiceReference1.UserCredentials uc = new ServiceReference1.UserCredentials(); uc.userName = "spoonyfork"; uc.password = "my_password"; uc.docbase = "edmsdev"; ServiceReference1.ACLUsersRequest aurt = new ServiceReference1.ACLUsersRequest(); aurt.aclName = "my_acl"; aurt.docbase = "edmsdev"; ServiceReference1.EDRSearchServiceSOAPImplClient client = new ServiceReference1.EDRSearchServiceSOAPImplClient(); ServiceReference1.ACLUsersResponse aure = new ServiceReference1.ACLUsersResponse(); aure = client.getACLUsers(aurt, uc); 
+4
source share
2 answers

First, you can try to declare an aclObjectId property for serialization, even if it is null . To do this, you need to find the class ACLUsersRequest definition class ACLUsersRequest and add

[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]

for this property. This will include it in the SOAP request as <aclObjectId xsi:nil="true" />

Secondly, you can simply declare this property as string.Empty :

 EDRSearchServiceSOAPImplClient client = new EDRSearchServiceSOAPImplClient(); var test = client.getACLUsers( new ACLUsersRequest() { aclName = "my_acl", docbase = "qwe", aclObjectId=string.Empty },//this should do the trick new UserCredentials() { userName = "lala", password = "123", docbase = "qwe" }); 

This will include it in the SOAP request as <aclObjectId /> , which is equal to <aclObjectId></aclObjectId>

If none of the methods work, you are dealing with a really bad web service provider and you must implement the written client itself, which will format the message as forced by the provider.

+4
source

The only thing I managed to find:

http://www.w3.org/TR/2007/REC-soap12-part2-20070427/

 4.2.1 Applications MAY process invocations with missing parameters but also MAY fail to process the invocation and return a fault. 

Did you create the web link manually? Can you provide the appropriate WSDL? + I can update this answer


 <operation name="getACLUsers"> <soap:operation soapAction=""></soap:operation> <input> <soap:body use="literal"></soap:body> </input> <output> <soap:body use="literal"></soap:body> </output> </operation> 

For me it does not look like there are several parameters at the SOAP level, only one speaks of XML or a string parameter. Does getAclUsers have multiple parameters?

I have limited SOAP knowledge that I will allow, but there is nothing about any parameters in WSDL ... Perhaps you are serializing XML, and XML serialization options are what you should look for instead?

0
source

Source: https://habr.com/ru/post/1339101/


All Articles