.net websercie,客户端,怎么获取到发出的xml和收到的xml?

解决方案 »

  1.   

    this.webserviceMethod(string xml) //发送出去string resultXml = this.webserviceMethod(); //获取xml字符串
    将XML变成字符串发送,接收。用得时候
    XmlDoucment doc = new XmlDocument();
    doc.LoadXml(xml);
      

  2.   

    查到了。可能使用SOAP Extensions
    还没弄明白,客户端是怎么跟自定义的扩展类挂钩的。
      

  3.   

    对可以用Soap Extension
    using System;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    using System.IO;
    using System.Net; // 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;
    }
    } 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;
    }
    }
    }
      

  4.   

    客户端使用,好像要手动修改Proxy class的attribute参考
    How do I deploy a SOAP extension on the client proxy
    http://bytes.com/topic/net/answers/427659-how-do-i-deploy-soap-extension-client-proxy
      

  5.   

    楼上给的代码,现在能调用起来了。但是需要在每个接口方法前面都加上[TraceExtensionAttribute]。
    怎么设置,才能不用每个接口方法前面单独设置? 我把
     [AttributeUsage(AttributeTargets.Method)]
        public class TraceExtensionAttribute : SoapExtensionAttribute
    改成
     [AttributeUsage(AttributeTargets.All)]
        public class TraceExtensionAttribute : SoapExtensionAttribute在接口类前面加上[TraceExtensionAttribute],也不起作用。怎么设置,才能不用每个接口方法前面单独设置?