2009-01-20 30 views
10

Llamo a un servicio web HTTPS externo.Obtener mensaje SOAP antes de enviarlo al servicio web en .NET

Para verificar qué es lo que está mal, el propietario necesita la solicitud SOAP que estoy enviando.

tengo una referencia web y la clase de proxy generada generado por VS 2008 ...

¿Hay una manera de ver el mensaje SOAP antes de enviarla?

Estoy pensando en algún código .net ... porque los Sniffers que probé no "vieron" la invocación del servicio web, no sé por qué.

Respuesta

5
+0

El segundo enlace tiene múltiples opciones. La respuesta aceptada no es necesariamente la mejor (las tres soluciones son buenas). FYI, me gustó más la opción Fiddler. – Nullius

0

Si tu trabaje en un entorno más restringido y no tenga el lujo de utilizar una aplicación como Fiddler, puede hacer lo siguiente:

  1. Genere su referencia web como de costumbre.
  2. Escribe el código para realizar cualquier llamada al método web que me vayas a enviar.
  3. Crear un nuevo proyecto ASP .NET de su elección, fui con MVC 4.
  4. Cree un controlador o un controlador/acción, y extraer la corriente de petición de la siguiente manera:

using (var reader = new System.IO.StreamReader(Request.InputStream)) { result = reader.ReadToEnd(); }

  1. Ponga un punto de interrupción en él y ejecútelo en modo de depuración.
  2. En su cliente, establezca la Url de la solicitud SOAP en su nuevo controlador/controlador.
  3. Ejecute su cliente. Debería atrapar el punto de interrupción en su aplicación web con su mensaje SOAP.

No es una solución ideal o bonita, pero si trabaja en un entorno moderadamente restringido, hace el trabajo bien.

9

Simplemente puede serializar el objeto de la petición, antes de subtmit, así:

var sreq = new SomeSoapRequest(); 

// ... fill in here ... 

var serxml = new System.Xml.Serialization.XmlSerializer(sreq.GetType()); 
var ms = new MemoryStream(); 
serxml.Serialize(ms, sreq); 
string xml = Encoding.UTF8.GetString(ms.ToArray()); 

// in xml string you have SOAP request 
2

Puede utilizar IClientMEssageInspector y IEndpointBehavior por cumplir esto.He encontrado usando esta manera puede capturar la solicitud de jabón exacta de probabilidades que el violinista uno:

Crear una clase como esta en el mismo proyecto:

public class ClientMessageInspector : System.ServiceModel.Dispatcher.IClientMessageInspector 
    { 
     #region IClientMessageInspector Members 
     public string LastRequestXml { get; private set; } 

     public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
     { 

     } 

     public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
     { 
      string requestHeaderName = request.Headers.Action.Replace("urn:#",string.Empty); 
      LastRequestXml = request.ToString(); 
      string serializedRequestFile = string.Format(requestHeaderName + "_request_{0}.xml", DateTime.Now.ToString("yyyyMMddHHmmss")); 
      string exportedFolder = ConfigurationManager.AppSettings["SubmittedRequestXmLocation"]; 
      printSoapRequest(request, exportedFolder, serializedRequestFile); 

      return request; 
     } 

     public void printSoapRequest(System.ServiceModel.Channels.Message request, string exportedFolder, string fileName) 
     { 
      if (exportedFolder.Equals(string.Empty)) 
       return; 

      if (!Directory.Exists(exportedFolder)) 
      { 
       Directory.CreateDirectory(exportedFolder); 
      } 
      string exportedFile = string.Format("{0}\\{1}", exportedFolder, fileName); 
      if (File.Exists(exportedFile)) 
      { 
       File.Delete(exportedFile); 
      } 

      string strRequestXML = request.ToString(); 
      XDocument xDoc = XDocument.Parse(strRequestXML); 
      XmlWriter xw = XmlWriter.Create(exportedFile); 
      xDoc.Save(xw); 
      xw.Flush(); 
      xw.Close(); 
      LogOutput("Request file exported: " + exportedFile); 

     } 

    } 

    public class CustomInspectorBehavior : IEndpointBehavior 
    { 
     private readonly ClientMessageInspector clientMessageInspector = new ClientMessageInspector(); 

     public string LastRequestXml 
     { 
      get { return clientMessageInspector.LastRequestXml; } 
     } 

     public string LastResponseXml 
     { 
      get { return clientMessageInspector.LastRequestXml; } 
     } 

     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(clientMessageInspector); 
     } 
    } 

Entonces se le puede llamar como la siguiente:

ProxyClass _class = new ProxyClass(); 
var requestInterceptor = new CustomInspectorBehavior(); 
      _client.Endpoint.Behaviors.Add(requestInterceptor); 

Cuando llame al método de servicio, ejecutará automáticamente el interceptor e imprimirá la salida. Usando esta forma también puede manipular el mensaje de jabón antes de enviarlo al servidor.

+0

Uso *** Referencia del servicio web ***, *** no Referencia WCF *** – Kiquenet

+0

Si utiliza la referencia del servicio web, puede construir exactamente todo el sobre desde cero. Sin embargo, no lo recomiendo debido a su implementación sólida y moderna. – mting923

Cuestiones relacionadas