2010-07-26 36 views
10

Tengo un SOAP WSDL (que se encuentra aquí: https://portal.bsh-partner.com/picenter/server/a2a/) y estoy tratando de consumir los servicios web.Consumir el servicio web SOAP en ASP.NET

var soapEnvelope = string.Empty; 
soapEnvelope = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; 
soapEnvelope += "<soapenv:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:q0=\"http://thexmlhost.com\">"; 
soapEnvelope += "<q0:Connect>"; 
soapEnvelope += "<q0:Username>username</q0:Username>"; 
soapEnvelope += "<q0:Password>password</q0:Password>"; 
soapEnvelope += "</q0:Connect>"; 
soapEnvelope += "</soapenv:Body>"; 
soapEnvelope += "</soapenv:Envelope>"; 

var xmlHttp = new MSXML2.ServerXMLHTTP40(); 
xmlHttp.open("POST", "https://thexmlhost.com/", "", ""); 
xmlHttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8"); 
xmlHttp.setRequestHeader("SOAPAction", "thexmlhost.com/"); 

xmlHttp.send(soapEnvelope); 

xmlHttp.waitForResponse(500); 

var outXml = xmlHttp.responseText; 

La respuesta sigue volviendo una página de error de respuesta HTTP general. ¿Alguna idea de cómo debería pasar mi Soap Envelope para obtener la respuesta adecuada del servicio web?

+3

¿Por qué demonios haces manualidades con un mensaje de jabón? –

+2

Idk si debería votar esto porque es un gran ejemplo de hacerlo mal o menospreciarlo por la misma razón ... –

Respuesta

9

Acabo de notar que está usando este código en el lado del servidor.


Esta no es la forma de consumir servicios web en .NET. Use el comando "Agregar referencia de servicio" en Visual Studio para crear clases de proxy que le permitan consumir el servicio muy fácilmente.

Vea How to Consume a Web Service para un ejemplo, así como http://msdn.microsoft.com/wcf/.

Además, nunca usa técnicas de manipulación de cadenas cuando se trabaja con XML. En resumen, las reglas para cadenas y para XML son diferentes. .NET tiene varias API XML para trabajar con XML, y todas conocen las reglas.

+0

¿Qué quisiste decir con "Por lo general, es mejor consumir un servicio SOAP desde el lado del servidor. Es mucho más fácil " ? –

+0

@ Allen: hasta que noté "' string.Empty' ", pensé que era JavaScript. –

+0

ahhh que tiene sentido –

3

Sólo echando un vistazo a su código, parece que se le olvidó añadir su cuerpo etiqueta de inicio: <soapenv:Body>

A menos que tenga una razón particular para ser la construcción de su mensaje de forma manual, lo recomiendo encarecidamente utilizar un proxy generada a partir de la Herramienta svcutil.exe que viene con visual studio 2008 o posterior. (esta herramienta se usa automáticamente en Visual Studio si utiliza la función "Agregar referencia de servicio"), suponiendo que no tiene ningún problema con el uso de WCF para gestionar la comunicación con su servicio web.

Alternativamente, si por alguna razón no puede usar WCF, como si estuviera desarrollando en .Net 2.0 con Visual Studio 2005 en cuyo caso no tendría la característica "Agregar referencia de servicio" disponible, entonces podría siga usando la característica anterior "Agregar referencia web" de Visual Studio para generar un proxy para su servicio web. Esta característica utiliza la herramienta wsdl.exe en lugar de svcutil.exe.

De lo contrario, si realmente debe continuar con este enfoque de construir el mensaje SOAP manualmente, al menos recomiendo agregar un registro a su aplicación para que pueda analizar más fácilmente el mensaje construido cuando algo sale mal.

+0

(eliminado mi comentario anterior debido a que podría decirse que es incorrecto) Accedo a su punto; en este punto, WCF debería ser el enfoque recomendado, si está disponible. Tenga en cuenta que una serie de enlaces en MSDN en VS2010 ASP.NET Web Services (http://msdn.microsoft.com/en-us/library/yzbxwf53.aspx) mencionan específicamente la funcionalidad "Referencia web"/wsdl.exe es heredado y se proporciona para compatibilidad con versiones anteriores. –

21

Si tiene WSDL, puede crear una referencia de servicio en Visual Studio y generará una clase de proxy para usted. A menos que me falte algo de precisión en su pregunta, sería mucho más confiable y mucho más fácil de implementar y usar.

Espero que ayude.

+2

Finalmente, una respuesta correcta –

+1

-1 para sugerir una referencia web. –

+0

@John - ¿Podrías dar más detalles? Editar: ¿no te refieres a mi pequeño error de no utilizar la terminología de "Referencia de servicio"? Actualizaré debidamente y permaneceré desconcertado sobre por qué eso hace que sea una mala respuesta. –

Cuestiones relacionadas