【问题标题】:Read XML into WSDL将 XML 读入 WSDL
【发布时间】:2012-02-09 18:13:46
【问题描述】:

我正在我的项目 .Net C# 中通过 WSDL Webservice 进行一些调用,我需要查看 WSDL 发送和接收的 XML 请求和响应,谁能帮助我如何阅读这些信息?

【问题讨论】:

  • 您能否单步执行代码并在调用 WebService 方法之后,如果您已在项目中正确使用它,您能否调试并在变量上执行 QuickWatch 以查看返回的 xml ..
  • 当您说“WSDL Web 服务”时,您的意思是 .asmx 服务?

标签: c# web-services asmx


【解决方案1】:

您可以在服务器或客户端机器上使用fiddler 来捕获请求和响应。只需启动它,它就会监控机器上的 http 流量。

【讨论】:

    【解决方案2】:

    您需要使用 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

    【讨论】:

      猜你喜欢
      • 2013-05-11
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 2012-02-24
      相关资源
      最近更新 更多