Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to capture XML when calling web service from win apps
    primarykey
    data
    text
    <p>in my solution i have three project. one is web service (ASMX), another is win form apps from where i am calling the web service. another class library where class has been design extending SoapExtension class.</p> <p>my objective is to capture response &amp; request xml when i am calling web service from my win form apps.i am getting <strong>object reference not set</strong> error when i am trying to capture xml.</p> <h2>here is my class library source code.</h2> <pre><code>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web.Services; using System.Web.Services.Protocols; using System.IO; using System.Net; using System.Xml; namespace SoapLogger { public class TraceExtension : SoapExtension { private Stream oldStream; private Stream newStream; private static XmlDocument xmlRequest; /// &lt;summary&gt; /// Gets the outgoing XML request sent to PayPal /// &lt;/summary&gt; public static XmlDocument XmlRequest { get { return xmlRequest; } } private static XmlDocument xmlResponse; /// &lt;summary&gt; /// Gets the incoming XML response sent from PayPal /// &lt;/summary&gt; public static XmlDocument XmlResponse { get { return xmlResponse; } } /// &lt;summary&gt; /// Save the Stream representing the SOAP request /// or SOAP response into a local memory buffer. /// &lt;/summary&gt; /// &lt;param name="stream"&gt; /// &lt;returns&gt;&lt;/returns&gt; public override Stream ChainStream(Stream stream) { oldStream = stream; newStream = new MemoryStream(); return newStream; } /// &lt;summary&gt; /// If the SoapMessageStage is such that the SoapRequest or /// SoapResponse is still in the SOAP format to be sent or received, /// save it to the xmlRequest or xmlResponse property. /// &lt;/summary&gt; /// &lt;param name="message"&gt; public override void ProcessMessage(SoapMessage message) { switch (message.Stage) { case SoapMessageStage.BeforeSerialize: break; case SoapMessageStage.AfterSerialize: xmlRequest = GetSoapEnvelope(newStream); CopyStream(newStream, oldStream); break; case SoapMessageStage.BeforeDeserialize: CopyStream(oldStream, newStream); xmlResponse = GetSoapEnvelope(newStream); break; case SoapMessageStage.AfterDeserialize: break; } } /// &lt;summary&gt; /// Returns the XML representation of the Soap Envelope in the supplied stream. /// Resets the position of stream to zero. /// &lt;/summary&gt; /// &lt;param name="stream"&gt; /// &lt;returns&gt;&lt;/returns&gt; private XmlDocument GetSoapEnvelope(Stream stream) { XmlDocument xml = new XmlDocument(); stream.Position = 0; StreamReader reader = new StreamReader(stream); xml.LoadXml(reader.ReadToEnd()); stream.Position = 0; return xml; } /// &lt;summary&gt; /// Copies a stream. /// &lt;/summary&gt; /// &lt;param name="from"&gt; /// &lt;param name="to"&gt; private void CopyStream(Stream from, Stream to) { TextReader reader = new StreamReader(from); TextWriter writer = new StreamWriter(to); writer.WriteLine(reader.ReadToEnd()); writer.Flush(); } #region NoOp /// &lt;summary&gt; /// Included only because it must be implemented. /// &lt;/summary&gt; /// &lt;param name="methodInfo"&gt; /// &lt;param name="attribute"&gt; /// &lt;returns&gt;&lt;/returns&gt; public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return null; } /// &lt;summary&gt; /// Included only because it must be implemented. /// &lt;/summary&gt; /// &lt;param name="WebServiceType"&gt; /// &lt;returns&gt;&lt;/returns&gt; public override object GetInitializer(Type WebServiceType) { return null; } /// &lt;summary&gt; /// Included only because it must be implemented. /// &lt;/summary&gt; /// &lt;param name="initializer"&gt; public override void Initialize(object initializer) { } #endregion NoOp } } </code></pre> <h2>here i will show how i am calling web service from win apps</h2> <pre><code> private void button1_Click(object sender, EventArgs e) { using (ServiceRef.TestServiceSoapClient oService = new ServiceRef.TestServiceSoapClient()) { textBox1.Text = oService.HelloWorld("Sudip"); var soapRequest = SoapLogger.TraceExtension.XmlRequest.InnerXml; var soapResponse = SoapLogger.TraceExtension.XmlResponse.InnerXml; } } </code></pre> <p>this two line is giving object reference error</p> <pre><code> var soapRequest = SoapLogger.TraceExtension.XmlRequest.InnerXml; var soapResponse = SoapLogger.TraceExtension.XmlResponse.InnerXml; </code></pre> <p>i just could not figure out why i am getting error.</p> <p>in win form apps has one app.config where i register my class library assembly to capture the xml. here is my app.config details</p> <pre><code>&lt;?xml version="1.0"?&gt; &lt;configuration&gt; &lt;system.serviceModel&gt; &lt;bindings&gt; &lt;basicHttpBinding&gt; &lt;binding name="TestServiceSoap"/&gt; &lt;/basicHttpBinding&gt; &lt;/bindings&gt; &lt;client&gt; &lt;endpoint address="http://localhost:6804/Service1.asmx" binding="basicHttpBinding" bindingConfiguration="TestServiceSoap" contract="ServiceRef.TestServiceSoap" name="TestServiceSoap"/&gt; &lt;/client&gt; &lt;/system.serviceModel&gt; &lt;system.web&gt; &lt;compilation debug="true" targetFramework="4.0" /&gt; &lt;webServices&gt; &lt;soapExtensionTypes&gt; &lt;add type="SoapLogger.TraceExtension,SoapLogger" priority="1" group="0" /&gt; &lt;/soapExtensionTypes&gt; &lt;/webServices&gt; &lt;/system.web&gt; &lt;startup&gt;&lt;supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/&gt; &lt;/startup&gt; &lt;/configuration&gt; </code></pre> <p>when i search google just to know how to capture request/response xml then i got this kind of many article. i followed many but nothing works.</p> <p>this url i followed to get the job done <a href="http://jramirezdev.net/blog/c-tip-capturar-los-mensajes-soap-de-un-servicio-asmx-que-hemos-referenciado" rel="nofollow">http://jramirezdev.net/blog/c-tip-capturar-los-mensajes-soap-de-un-servicio-asmx-que-hemos-referenciado</a></p> <p>what kind of mistake i am making not clear. i set the break point at every method in my class library method but when web service call no method got executed in the class library. i dont want to use any tool like wireshark,fiddler to capture the request/response xml rather want to do same thing programatically.</p> <p>so please guide me what is my mistake. why i am getting object reference not set error. please have a look at my code or go to the url link and tell me what is wrong in my approach.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload