2012-02-09 93 views
1

我正在通過WSDL Webservice在我的項目.Net C#中調用一些調用,並且需要查看由WSDL發送和接收的XML請求和響應,任何人都可以幫助我如何讀取此信息?將XML讀取到WSDL中

+0

您可以逐步直通代碼並調用WebService的方法後,也就是希望,如果你已經在你的項目中正常消耗它,你可以調試和做一個快速監視該變量看到返回的XML .. – MethodMan 2012-02-09 18:16:53

+0

當你說「WSDL Web服務」,你的意思是一個.asmx服務? – 2012-02-09 20:52:38

回答

1

您可以在服務器或客戶機上使用fiddler來捕獲請求和響應。只需啓動它,它就會監控機器上的http流量。

1

您需要使用SoapExtensions。該方法將簡單地寫出包含web服務執行的所有通信的日誌文件。 XML將在那裏。

C#代碼:

// Define a SOAP Extension that traces the SOAP request and SOAP 
// response for the XML Web service method the SOAP extension is 
// applied to. 

public class TraceExtension : SoapExtension 
{ 
    Stream oldStream; 
    Stream newStream; 
    string filename; 

    // Save the Stream representing the SOAP request or SOAP response into 
    // a local memory buffer. 
    public override Stream ChainStream(Stream stream) 
    { 
     oldStream = stream; 
     newStream = new MemoryStream(); 
     return newStream; 
    } 

    // When the SOAP extension is accessed for the first time, the XML Web 
    // service method it is applied to is accessed to store the file 
    // name passed in, using the corresponding SoapExtensionAttribute. 
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) 
    { 
     return ((TraceExtensionAttribute) attribute).Filename; 
    } 

    // The SOAP extension was configured to run using a configuration file 
    // instead of an attribute applied to a specific XML Web service 
    // method. 
    public override object GetInitializer(Type WebServiceType) 
    { 
     // Return a file name to log the trace information to, based on the 
     // type. 
     return "C:\\" + WebServiceType.FullName + ".log";  
    } 

    // Receive the file name stored by GetInitializer and store it in a 
    // member variable for this specific instance. 
    public override void Initialize(object initializer) 
    { 
     filename = (string) initializer; 
    } 

    // If the SoapMessageStage is such that the SoapRequest or 
    // SoapResponse is still in the SOAP format to be sent or received, 
    // save it out to a file. 
    public override void ProcessMessage(SoapMessage message) 
    { 
     switch (message.Stage) 
     { 
      case SoapMessageStage.BeforeSerialize: 
       break; 
      case SoapMessageStage.AfterSerialize: 
       WriteOutput(message); 
       break; 
      case SoapMessageStage.BeforeDeserialize: 
       WriteInput(message); 
       break; 
      case SoapMessageStage.AfterDeserialize: 
       break; 
      default: 
       throw new Exception("invalid stage"); 
     } 
    } 

    public void WriteOutput(SoapMessage message) 
    { 
     newStream.Position = 0; 
     FileStream fs = new FileStream(filename, FileMode.Append, 
      FileAccess.Write); 
     StreamWriter w = new StreamWriter(fs); 

     string soapString = (message is SoapServerMessage) ? "SoapResponse" : "SoapRequest"; 
     w.WriteLine("-----" + soapString + " at " + DateTime.Now); 
     w.Flush(); 
     Copy(newStream, fs); 
     w.Close(); 
     newStream.Position = 0; 
     Copy(newStream, oldStream); 
    } 

    public void WriteInput(SoapMessage message) 
    { 
     Copy(oldStream, newStream); 
     FileStream fs = new FileStream(filename, FileMode.Append, 
      FileAccess.Write); 
     StreamWriter w = new StreamWriter(fs); 

     string soapString = (message is SoapServerMessage) ? 
      "SoapRequest" : "SoapResponse"; 
     w.WriteLine("-----" + soapString + 
      " at " + DateTime.Now); 
     w.Flush(); 
     newStream.Position = 0; 
     Copy(newStream, fs); 
     w.Close(); 
     newStream.Position = 0; 
    } 

    void Copy(Stream from, Stream to) 
    { 
     TextReader reader = new StreamReader(from); 
     TextWriter writer = new StreamWriter(to); 
     writer.WriteLine(reader.ReadToEnd()); 
     writer.Flush(); 
    } 
} 

// Create a SoapExtensionAttribute for the SOAP Extension that can be 
// applied to an XML Web service method. 
[AttributeUsage(AttributeTargets.Method)] 
public class TraceExtensionAttribute : SoapExtensionAttribute 
{ 

    private string filename = "c:\\log.txt"; 
    private int priority; 

    public override Type ExtensionType 
    { 
     get { return typeof(TraceExtension); } 
    } 

    public override int Priority 
    { 
     get { return priority; } 
     set { priority = value; } 
    } 

    public string Filename 
    { 
     get 
     { 
      return filename; 
     } 
     set 
     { 
      filename = value; 
     } 
    } 
} 

在你的web.config:

<webServices> 
     <soapExtensionTypes> 
       <add type="ClassPath.To.Your.TraceExtension, Namespace.Containing.WebserviceCalls" priority="1" group="1"/> 
     </soapExtensionTypes> 
    </webServices> 

這裏描述的解決方案:

soap extension to log my webservices

How to trace ScriptService WebService requests?

http://blog.encoresystems.net/articles/how-to-capture-soap-envelopes-when-consuming-a-web-service.aspx