Intercept SOAP messages from and to a web service at the client

后端 未结 2 1311
挽巷
挽巷 2020-12-04 16:41

I have a client that communicates with a web service. The class that I communicate with is a C# class that is generated through wsdl.exe. I now want to log all incoming and

相关标签:
2条回答
  • 2020-12-04 17:33

    I would suggest looking into using a SOAP extension, which in my opinion is ideal for this scenario. Here are a few links that describe the process.

    http://msdn.microsoft.com/en-us/magazine/cc164007.aspx

    https://ebay.custhelp.com/cgi-bin/ebay.cfg/php/enduser/std_adp.php?p_faqid=350

    http://www.codeproject.com/KB/webservices/efficientsoapextension.aspx

    0 讨论(0)
  • 2020-12-04 17:36

    You need to use "Add Service Reference" and not "Add Web Reference" feature to use this solution, it can be used if the service is ASMX or WCF. (You need to use .NET Framework 3.X to use this feature)

    This article will help you to add the service reference to your C# project.

    To intercept and XMLs of the request and the response, Implement these two classes:

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

    Then, change the call code to:

    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**** This is not related with the serverside technology, you can use it with WCF, ASMX, PHP, ... web services, I have tested on: http://www.w3schools.com/webservices/tempconvert.asmx

    And got the following XMLs:

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

    "Add Web Reference" is not specialized for ASMX and is not an ASMX client-side technology, and "Add Service Reference"is not the WCF client-side technology, you can use both to add reference to ASMX, WCF, JSP-developed or PHP-developed, web service, you need your application to use .Net framework 3.5 to use "Add Service Reference".

    This article mentions:

    When using the Add Web Reference dialog box in Visual Studio, a client proxy is generated using WSDL information and is added to the Visual Studio project. This is usually used for ASMX services, but you can also use the Add Web Reference dialog box to create a client proxy for WCF services. However, you need to manually type the service URL, and the proxy that is generated uses XML serialization, which is the only type of serialization supported. To create client proxies for WCF services that support the data contract serializer, you can use the Svcutil.exe tool or use the Add Service Reference feature of the Visual Studio Development Tools for the .NET Framework 3.x.

    0 讨论(0)
提交回复
热议问题