我是靠谱客的博主 甜美小馒头,最近开发中收集的这篇文章主要介绍用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 >

最后

以上就是甜美小馒头为你收集整理的用asp.net2 开发SoapExtension所出现的问题的全部内容,希望文章能够帮你解决用asp.net2 开发SoapExtension所出现的问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部