用asp.net2 開發SoapExtension所出現的問題

鬱悶 !!最近在學習SoapExtension的開發,但是發現我web service代碼不會調用我編寫的TraceExtension這個Soap擴展,不知道是什麼原因造成的,還請各位高手在此多多指點一二。在此先謝過了。。。

下面這段代碼就是Soap擴展,我寫成了DLL來調用。

using System;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
using System.Net;

namespace TraceExtension
{
    
// 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 service頁面,不知爲何就是不調用日誌功能.

using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;



/// <summary>
/// WebService 的摘要說明
/// </summary>
[WebService(Namespace = "http://www.lanbridge.net/")]
[WebServiceBinding(ConformsTo 
= WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService {

    
public WebService () {

        
//如果使用設計的組件,請取消註釋以下行 
        
//InitializeComponent(); 
       
    }

    [WebMethod]
    [TraceExtension.TraceExtension(Filename 
= "C:/data.xml",Priority=1)]
    
public string HelloWorld(string v) {                
        
return v+"asdf";
    }
    

}

在web.config中我做了以下配置:

 <webServices>
      
<soapExtensionTypes>        
        
<add type="TraceExtension.TraceExtension,TraceExtension" priority="1"  group="High"  />
      
</soapExtensionTypes>
    
</webServices>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章