2012-02-09 92 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