2012-02-09 20 views
1

私のプロジェクトでWSDL Webservice経由でいくつかの呼び出しを行っています.Net C#と、XML要求と応答がWSDLで送受信されているのを確認する必要があります。情報?XMLをWSDLに読み込む

+0

あなたは、コードを通してステップすることができますし、Webサービスメソッドを呼び出した後、あなたのプロジェクトで適切にそれを消費している場合、それはあなたがデバッグすると上の[クイックウォッチを行うことができ、うまくいけばです戻り値のXMLを表示する変数。 – MethodMan

+0

"WSDL Webサービス"と言うと、.asmxサービスを意味しますか? –

答えて

1

サーバーまたはクライアントマシンでfiddlerを使用して、要求と応答を取得できます。それを起動するだけで、マシン上のhttpトラフィックを監視します。

1

SoapExtensionsを使用する必要があります。このメソッドは、Webサービスが実行するすべての通信を含むログファイルを単に書き出します。 XMLがそこにあります。

C#コード:あなたのweb.configファイルで

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

:ソリューションは、ここで説明されて

<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

関連する問題