c# - partir - Referencia de servicio no cargada: no se pudo encontrar el esquema con el espacio de nombres de destino
create web service from wsdl c# (1)
Intento agregar una referencia de servicio a mi proyecto y recibo constantemente el mismo error.
Creé un servicio simulado con la interfaz de usuario SOAP que parece estar bien, luego trato de agregar una referencia de servicio a este servicio simulado y aparece el error:
Warning 14 Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace ''urn:oasis:names:tc:dss:1.0:core:schema'' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace=''http://tempuri.org/esign'']/wsdl:portType[@name=''EsignServiceSoap11PortType'']
La importación en el wsdl donde el esquema con el espacio de nombres urn: oasis: names: tc: dss: 1.0: core: schema se está cargando es:
<wsdl:types>
<schema xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<import namespace="urn:oasis:names:tc:dss:1.0:core:schema" schemaLocation="oasis-dss-core-schema-v1.0-os.xsd"/>
</schema>
.....
</wsdl:types>
Ya he intentado vincular el schemaLocation directamente al archivo en la misma carpeta que wsdl, a una url donde se publicó en un servidor privado y a una uri pública donde también se publicó.
Siempre recibo el mismo error y empiezo a sentir que tal vez estoy equivocado con el origen del problema.
Cualquier idea será muy apreciada.
ACTUALIZACIÓN: Inyecté urn: oasis: names: tc: dss: 1.0: core: definición completa del esquema dentro de mi archivo wsdl, en lugar de intentar importarlo. Cuando lo hago, la interfaz de usuario de SOAP aún crea correctamente el servicio de burla, sin embargo, cuando trato de agregar una referencia de servicio, este error se produce durante el descubrimiento del servicio:
The document was understood, but it could not be processed.
- The WSDL document contains links that could not be resolved.
- DTD is prohibited in this XML document.
Metadata contains a reference that cannot be resolved: ''http://elite8100-3:8088/mockEsignServiceSoap11Binding?WSDL''.
The content type text/html; charset=iso-8859-1 of the response message does not match the content type of the binding (application/soap+xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 455 bytes of the response were: ''<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>Server</soap:Value>
</soap:Code>
<soap:Reason>
<!--1 or more repetitions:-->
<soap:Text xml:lang="en">Missing operation for soapAction [null] and body element [null] with SOAP Version [SOAP 1.2]</soap:Text>
</soap:Reason>
</soap:Fault>
</soap:Body>
</soap:Envelope>''.
The remote server returned an error: (500) Internal Server Error.
If the service is defined in the current solution, try building the solution and adding the service reference again.
EDIT2: He utilizado Fiddler para comprobar el tráfico http al intentar crear el proxy, como se sugiere en la respuesta. Durante la creación, aparece un error de servidor interno de 500 en Fiddler cuando intentaba llegar a la url de mockService, la respuesta del servidor era "Operación faltante para soapAction [null] y body element [null] con versión SOAP [SOAP 1.2]".
Este es, actualmente, el WSDL que estoy usando para crear el servicio de prueba.
<wsdl:types>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://www.w3.org/2001/XMLSchema" schemaLocation="http://aplicaciones.serpasa.es/CONTROLAMBIENTAL/oasis-dss-core-schema-v1.0-os.xsd"/>
</schema>
<schema xmlns="http://princast.es/esign/2.0/esign.xsd">
<import namespace="http://princast.es/esign/2.0/esign.xsd" schemaLocation="http://aplicaciones.serpasa.es/CONTROLAMBIENTAL/esign.xsd"/>
</schema>
</wsdl:types>
<wsdl:message name="SignRequestMessage">
<wsdl:part element="dss:SignRequest" name="payload"/>
</wsdl:message>
<wsdl:message name="SignResponseMessage">
<wsdl:part element="dss:SignResponse" name="payload"/>
</wsdl:message>
<wsdl:message name="VerifyRequestMessage">
<wsdl:part element="dss:VerifyRequest" name="payload"/>
</wsdl:message>
<wsdl:message name="VerifyResponseMessage">
<wsdl:part element="dss:VerifyResponse" name="payload"/>
</wsdl:message>
<wsdl:message name="GetSignInfoFromDocumentRequestMessage">
<wsdl:part element="esign:SignInfoRequest" name="payload"/>
</wsdl:message>
<wsdl:message name="GetSignInfoFromDocumentResponseMessage">
<wsdl:part element="esign:SignInfo" name="payload"/>
</wsdl:message>
<wsdl:message name="GetSignConfigurationRequestMessage">
<wsdl:part element="esign:SignConfigurationRequest" name="payload"/>
</wsdl:message>
<wsdl:message name="GetSignConfigurationResponseMessage">
<wsdl:part element="esign:SupportedSignConfiguration" name="payload"/>
</wsdl:message>
<!-- Port -->
<wsdl:portType name="EsignServiceSoap11PortType">
<wsdl:operation name="sign">
<wsdl:input message="impl:SignRequestMessage" name="signRequest"/>
<wsdl:output message="impl:SignResponseMessage" name="signResponse"/>
</wsdl:operation>
<wsdl:operation name="verify">
<wsdl:input message="impl:VerifyRequestMessage" name="verifyRequest"/>
<wsdl:output message="impl:VerifyResponseMessage" name="verifyResponse"/>
</wsdl:operation>
<wsdl:operation name="getSignConfiguration">
<wsdl:input message="impl:GetSignConfigurationRequestMessage" name="getSignConfigurationRequest"/>
<wsdl:output message="impl:GetSignConfigurationResponseMessage" name="getSignConfigurationResponse"/>
</wsdl:operation>
<wsdl:operation name="getSignInfoFromDocument">
<wsdl:input message="impl:GetSignInfoFromDocumentRequestMessage" name="getSignInfoFromDocumentRequest"/>
<wsdl:output message="impl:GetSignInfoFromDocumentResponseMessage" name="getSignInfoFromDocumentResponse"/>
</wsdl:operation>
</wsdl:portType>
<!-- Binding -->
<wsdl:binding name="EsignServiceSoap11Binding" type="impl:EsignServiceSoap11PortType">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sign">
<wsdl:documentation>
Realiza una firma digital delegada sobre un
documento segun el estandard OASIS Digital Signature Service (DSS)
</wsdl:documentation>
<wsdlsoap:operation soapAction="urn:sign"/>
<wsdl:input name="signRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="signResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="verify">
<wsdl:documentation>
Verifica una firma digital OASIS Digital
Signature Service (DSS)
</wsdl:documentation>
<wsdlsoap:operation soapAction="urn:verify"/>
<wsdl:input name="verifyRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="verifyResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getSignConfiguration">
<wsdl:documentation>
Obtiene los certificados con los que una
aplicacion en el MC de Firma Digital puede realizar
una firma
</wsdl:documentation>
<wsdlsoap:operation soapAction="urn:getSignConfiguration"/>
<wsdl:input name="getSignConfigurationRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getSignConfigurationResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="getSignInfoFromDocument">
<wsdl:documentation>
Obtiene informacion de un fichero de firma
</wsdl:documentation>
<wsdlsoap:operation soapAction="urn:getSignInfoFromDocument"/>
<wsdl:input name="getSignInfoFromDocumentRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getSignInfoFromDocumentResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="EsignService">
<wsdl:documentation>
Servicio web de firma digital
</wsdl:documentation>
<wsdl:port binding="impl:EsignServiceSoap11Binding" name="EsignServiceSoap11Port">
<wsdlsoap:address location="http://someexternalsite.com"/>
</wsdl:port>
</wsdl:service>
He descargado cada .xsd asociado y publicado en un servidor público, también he cambiado schemaLocations para que apunten a direcciones en este servidor público, sin embargo, el problema parece estar relacionado con la estructura WSDL.
El problema principal antes de su actualización debe ser que su sintaxis es incorrecta. Donde dices <schema xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
la herramienta está esperando <schema xmlns="http://www.w3.org/2001/XMLSchema">
. Para importar simplemente un archivo XSD externo, el arreglo de espacio de nombres XML predeterminado anterior es todo lo que necesita.
El esquema de importación / inclusión puede ser bastante abarrotado; para esos casos, cuando uno los coloca dentro del WSDL, como ha sugerido, es fácil cometer errores, ya que no es un simple caso de simplemente cortar y pegar. Por ejemplo, algunas herramientas pueden tener problemas al manejar referencias que originalmente se basaban en xsd: include; camaleón incluye no puede ser reproducido dentro de un WSDL; y todas sus importaciones xsd: NO DEBEN usar el atributo schemaLocation.
Para solucionar problemas relacionados con referencias rotas, recomiendo encarecidamente el uso de un depurador HTTP, como Fiddler. Le dirá al menos qué referencias olvidó limpiar, o cualquier cabecera HTTP que su solución de simulación no configure correctamente.
Si lo anterior aún lo deja con algunas preguntas, tendrá que publicar su WSDL modificado.