Soy nuevo tanto en servicios web y C#, así que por favor me perdone si mi pregunta es muy simple. He buscado por ahí, pero no puede encontrar una respuesta, al menos uno basado en mis palabras clave.

Estoy tratando de llamar a un servicio web a través de C# (Visual Web Developer 2010 Express) pero me da un error como respuesta. Cuando me llame el mismo servicio web a través de soapUI no obtengo un error. Cuando comparo la solicitud SOAP desde C# en contra de la solicitud SOAP de soapUI C# de solicitud SOAP es la falta de una intencionalmente vacía parámetro <aclObjectId>. Cuando me tome el parámetro vacío de la soapUI solicitud me sale el mismo error. Para mí, la respuesta es que C# para enviar el parámetro incluso a pesar de que está vacía. He intentado esto se establece en null o «» pero fue en vano. Es allí una manera de forzar a mi C# de cliente de servicio web para enviar un parámetro vacío o tal vez enviar todos los parámetros, incluso si no tienen un valor?

WSDL

<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.3-b02-. --><!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's 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# JABÓN (no funciona)

<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 JABÓN (obras)

<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's 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>

De código de C#

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);
Es el valor que está vacía, o el tipo? El tipo tiene que ser conocido por efectos contractuales…
El valor está vacío. <ACLUsersRequest> <docbase>edmsdev</docbase> <aclName>my_acl</aclName> <aclObjectId></aclObjectId> </ACLUsersRequest>
Es difícil contestar w/o de la importación de los tipos de definiciones WSDL que se encuentra @ wwwdev.elaborado:80/EDRSearch?xsd=1, por lo que mejor podría proporcionar nosotros con la generada clases de C# desde el servicio de referencia y la forma en que los están utilizando (claramente, es que en SoapUI ‘aclObjectId’ no es un parámetro opcional).
He añadido el xsd y mi C# código de arriba. Yo no se establece un valor para aclObjectId debido a que la documentación para el servicio dice que es aclObjectId o aclName no tanto. Si me fije tanto puedo obtener una copia de la respuesta diciendo que no se fije tanto. Lo que yo creo que tienen que hacer es que C# enviar un vacío aclObjectId pero no sé cómo hacerlo. aurt.aclObjectId = ""; no por arte de magia poner un vacío <aclObjectId> en el JABÓN como yo esperaba.
usted puede comprobar mi respuesta, pero también ¿qué tipo de mensaje de error de hacer que usted recibe cuando usted no proporcionan ninguna <aclObjectId>?

OriginalEl autor spoonyfork | 2011-02-09

2 Comentarios

  1. 4

    Primer lugar, puede intentar declarar aclObjectId propiedad para serializar incluso si es null. Para que usted necesita para encontrar la definición de class ACLUsersRequest y agregar

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

    de la propiedad.
    Que ‘ll incluir en la solicitud SOAP como <aclObjectId xsi:nil="true" />

    Segundo, usted puede simplemente declarar que la propiedad como 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" });

    Que voy a incluir en la solicitud SOAP como <aclObjectId /> que es igual a <aclObjectId></aclObjectId>

    Si ninguno de los métodos de trabajo, entonces usted está tratando con muy malas proveedor de servicios web y la necesidad de implementar auto escrito cliente que tendrá formato de mensaje como forzado por el proveedor.

    Configuración de aclObjectId = string.Empty; hizo el truco, gracias!

    OriginalEl autor Ilya Dvorovoy

  2. 0

    Única cosa que he podido encontrar hasta ahora:

    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.

    Hizo generar una web de referencia manualmente? Se puede suministrar el adecuado WSDL? + Puedo actualizar esta respuesta


    <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>

    Para mí, esto no se ve como hay múltiples parámetros en el nivel SOAP, solo decir XML o parámetro de cadena. ¿GetAclUsers tener varios parámetros?

    He limitado JABÓN conocimiento lo admito, pero no hay nada en el WSDL listado de parámetros… tal vez eres serialising a XML y XML seriación opciones son lo que usted debe buscar en su lugar?

    Por la web de referencia a qué te refieres Servicio de Referencia definido por el Visual Web Developer 2010? Si es así, entonces no, he utilizado el de Agregar Referencia de Servicio asistente y suministra la dirección URL de WSDL. Yo no han generado nada de forma manual. He añadido el WSDL para el original de la pregunta anterior. La sección pertinente getACLUsers.
    He incluido el código XSD por encima de la cual hace el hechizo de los parámetros. Mi problema es que todavía no sé cómo enviar un vacío <aclObjectId> de C#.

    OriginalEl autor Kieren Johnstone

Dejar respuesta

Please enter your comment!
Please enter your name here