visual studio services publicos pruebas probar para online obtener ejemplo crear consumir como c# web-services soap asmx

c# - studio - Interceptar mensajes SOAP desde y hacia un servicio web en el cliente



web service soap (2)

Debe usar "Agregar referencia de servicio" y no la función "Agregar referencia web" para usar esta solución, se puede usar si el servicio es ASMX o WCF. (Debe usar .NET Framework 3.X para usar esta característica)

Este artículo lo ayudará a agregar la referencia de servicio a su proyecto de C #.

Para interceptar y XMLs de la solicitud y la respuesta, implemente estas dos clases:

public class InspectorBehavior : IEndpointBehavior { public string LastRequestXML { get { return myMessageInspector.LastRequestXML; } } public string LastResponseXML { get { return myMessageInspector.LastResponseXML; } } private MyMessageInspector myMessageInspector = new MyMessageInspector(); public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { clientRuntime.MessageInspectors.Add(myMessageInspector ); } } public class MyMessageInspector : IClientMessageInspector { public string LastRequestXML { get; private set; } public string LastResponseXML { get; private set; } public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) { LastResponseXML = reply.ToString(); } public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) { LastRequestXML = request.ToString(); return request; } }

Luego, cambie el código de la llamada a:

MyTestServiceSoapClient client = new MyTestServiceSoapClient(); var requestInterceptor = new InspectorBehavior(); client.Endpoint.Behaviors.Add(requestInterceptor ); client.DoSomething("param1", "param2", "param3"); string requestXML = requestInterceptor.LastRequestXML; string responseXML = requestInterceptor.LastResponseXML;

**** EDIT **** Esto no está relacionado con la tecnología del servidor, puede usarlo con WCF, ASMX, PHP, ... servicios web, lo he probado en: http://www.w3schools.com/webservices/tempconvert.asmx

Y obtuve los siguientes XML:

requestXML =

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/CelsiusToFahrenheit</Action> </s:Header> <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <CelsiusToFahrenheit xmlns="http://tempuri.org/"> <Celsius>50</Celsius> </CelsiusToFahrenheit> </s:Body> </s:Envelope>

responseXML =

<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"> <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" /> <soap:Body> <CelsiusToFahrenheitResponse xmlns="http://tempuri.org/"> <CelsiusToFahrenheitResult>122</CelsiusToFahrenheitResult> </CelsiusToFahrenheitResponse> </soap:Body> </soap:Envelope>

**** EDIT 2 ****

"Agregar referencia web" no está especializado en ASMX y no es una tecnología ASMX del lado del cliente, y "Agregar referencia de servicio" no es la tecnología del lado del cliente WCF, puede usar ambas para agregar referencia a ASMX, WCF, JSP-desarrollado o el servicio web desarrollado por PHP, necesita que su aplicación use .Net framework 3.5 para usar "Agregar referencia de servicio".

Este artículo menciona:

Cuando se utiliza el cuadro de diálogo Agregar referencia web en Visual Studio, se genera un proxy de cliente utilizando información WSDL y se agrega al proyecto de Visual Studio. Esto generalmente se usa para servicios ASMX, pero también puede usar el cuadro de diálogo Agregar referencia web para crear un proxy de cliente para servicios WCF. Sin embargo, debe escribir manualmente la URL del servicio, y el proxy que se genera utiliza la serialización XML, que es el único tipo de serialización compatible. Para crear proxies de cliente para los servicios de WCF que admiten el serializador de contrato de datos, puede usar la herramienta Svcutil.exe o utilizar la función Agregar referencia de servicio de las herramientas de desarrollo de Visual Studio para .NET Framework 3.x.

Tengo un cliente que se comunica con un servicio web. La clase con la que me comunico es una clase C # que se genera a través de wsdl.exe. Ahora quiero registrar todos los mensajes entrantes y salientes.

Lo que he hecho hasta ahora es escribir una clase que herede de la clase C # generada automáticamente y he reemplazado el método GetReaderForMessage. De esa manera puedo acceder al mensaje entrante más o menos así:

protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize) { System.Xml.XmlReader aReader = base.GetReaderForMessage(message, bufferSize); System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.Load(aReader); string content = doc.InnerXml.ToString(); System.Xml.XmlReader aReader2 = System.Xml.XmlReader.Create(new System.IO.StringReader(content)); return aReader2; }

Obviamente, no estoy muy contento con esta solución, porque básicamente estoy creando dos lectores xml. Uno para leer el contenido del mensaje SOAP y otro para regresar al método que llama. Además, no puedo hacer lo mismo con el método GetWriterForMessage.

Pero puede ser que estoy haciendo las cosas demasiado difíciles para empezar. ¿Es posible, por ejemplo, leer el contenido del objeto SoapClientMessage directamente? He leído algunos artículos que sugieren que debería usar SoapExtensions aquí, pero por lo que puedo entender, eso solo funcionaría si el ''cliente'' que estoy creando es en sí mismo un servicio web que en este caso no es así.

¿Alguna sugerencia?