概述
郁闷 !!最近在学习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;
}
}
}
}
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 " ;
}
}
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 >
< soapExtensionTypes >
< add type ="TraceExtension.TraceExtension,TraceExtension" priority ="1" group ="High" />
</ soapExtensionTypes >
</ webServices >
最后
以上就是甜美小馒头为你收集整理的用asp.net2 开发SoapExtension所出现的问题的全部内容,希望文章能够帮你解决用asp.net2 开发SoapExtension所出现的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复