怎么在南京人社网站做失业登记,网站建设点击打开指定网页,清远网站建设推广,3深圳网站建设上一篇文章地址#xff1a;构建安全的Xml Web Service系列一之初探使用Soap头 (5-22 12:53) 要分析Xml Web Service的安全性#xff0c;首先要解决的问题是我们能了解和清楚Soap消息的格式和内容#xff0c;如果获得不了SoapMessage#xff0c;分析如何能构建安全Xml w…上一篇文章地址构建安全的Xml Web Service系列一之初探使用Soap头 (5-22 12:53) 要分析Xml Web Service的安全性首先要解决的问题是我们能了解和清楚Soap消息的格式和内容如果获得不了SoapMessage分析如何能构建安全Xml web service也就无从下手即使分析出来自己也可 能模模糊糊不能定论。下面就分析下如何获得SoapMessage。 首先介绍一个类-SoapExtensionmsdn对这个类的备注为ASP.NET 允许通过扩展性机制生成与 SOAP 相关的基础结构。ASP.NET SOAP 扩展结构以一种扩展为中心该扩展可以在客户端或服务器上处理消息时在特定阶段中检查或修改消息。ASP.NET SOAP 扩展从 SoapExtension 类派生。GetInitializer 和 Initialize 方法提供其他可用机制用于初始化 SOAP 扩展以增强性能。ProcessMessage 是大多数 SOAP 扩展的核心原因是该方法在 SoapMessageStage 中定义的每一个阶段都被调用从而使 SOAP 扩展得以执行所需的该特定 SOAP 扩展的行为。对于需要修改 SOAP 请求或 SOAP 响应的 SOAP 扩展ChainStream 提供一个机会以接收要通过网络发送的建议数据。 仔细阅读这段文字如果您以前开发过windows程序那第一个应该想到的是原来web service的处理机制和windows窗口程序的消息机制竟然有着一曲同工之妙。下面谈谈如何利用这个类来截获Xml web Service请求和相应的Soap消息从而看看xml web service的庐山真面目。 首先大家先看看这个类这个类完成的功能是将Xml Web Service通过扩展的方式将每次的请求和响应的Soap消息通过日志的方式保存到文本文件中。日志记录的方式也有两种 1。针对每个WebMethod产生一个日志文件。 2。针对每个WebService产生一个日志文件 因为一个WebService可能包含一个或者多个WebMethod所以如果指定两种方法都支持的话那第二个日志两面应该包括第一个日志里面的内容而有些情况下是不需要对每个WebMethod都进行日志记录的这时候采用第一种记录方式增强了系统的灵活性。 下面是扩展了的SoapExtension webServices soapExtensionTypes add typeJillzhang.TraceExtension,Jillzhang priority1 groupHigh / /soapExtensionTypes /webServices 可以记录SoapMessage的SoapExtensionnamespace Jillzhang{ public class TraceExtension: SoapExtension { static readonly string LogRoot System.Configuration.ConfigurationManager.AppSettings[logRoot]; Stream oldStream; Stream newStream; string filename; /// summary /// 将请求流和响应流存到内存流中已被调用 /// /summary /// param namestream包含 SOAP 请求或响应的内存缓冲区/param /// returns它表示此 SOAP 扩展可以修改的新内存缓冲区。/returns public override Stream ChainStream(Stream stream) { oldStream stream; newStream new MemoryStream(); return newStream; } /// summary /// 在Xml Web Service第一次运行的时候一次性的将通过TraceExtensionAttribute传递进来的 /// 保存日志信息的文件名初始化 /// /summary /// param namemethodInfo应用 SOAP 扩展的 XML Web services 方法的特定函数原型/param /// param nameattribute应用于 XML Web services 方法的 SoapExtensionAttribute/param /// returnsSOAP 扩展将对其进行初始化以用于缓存/returns public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) { return ((TraceExtensionAttribute)attribute).Filename; } /// summary /// 替代为每个方法配置的保存SoapMessage文件名而是将整个网络服务 /// 的SoapMessage都保存到一个日志文件中,这个文件路径需要在Web Service /// 的配置文件中web.config指出,如 /// appSettings /// add keylogRoot valuec:\\serviceLog/ /// /appSettings /// /summary /// param nameWebServiceType网络服务的类型/param /// returns用于保存日志记录的文件路径/returns public override object GetInitializer(Type WebServiceType) { //return LogRoot.TrimEnd(\\) \\ WebServiceType.FullName .log; return LogRoot.TrimEnd(\\)\\ WebServiceType.FullName .log; } //获得文件名并将其保存下来 public override void Initialize(object initializer) { filename (string)initializer; } /// summary /// 当数据还为Soap格式的时候将数据写入日志 /// /summary /// param namemessage/param 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); } } /// summary /// 将SoapMessage写入到日志文件 /// /summary /// param namemessage/param 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) ? Soap响应 : Soap请求; w.WriteLine(----- soapString 在 DateTime.Now.ToString(yyyy年MM月dd日 HH时mm分ss秒)); 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) ? Soap请求 : Soap响应; w.WriteLine(----- soapString 在 DateTime.Now.ToString(yyyy年MM月dd日 HH时mm分ss秒)); w.Flush(); newStream.Position 0; Copy(newStream, fs); w.Close(); newStream.Position 0; } /// summary /// 拷贝流到流 /// /summary /// param namefrom/param /// param nameto/param void Copy(Stream from, Stream to) { TextReader reader new StreamReader(from); TextWriter writer new StreamWriter(to); writer.WriteLine(reader.ReadToEnd()); writer.Flush(); } } //创建一个用于在WebMethod上使用的SoapExtension属性 [AttributeUsage(AttributeTargets.Method)] public class TraceExtensionAttribute : SoapExtensionAttribute { private string filename c:\\log.txt; private int priority; /// summary /// 扩展类型 /// /summary public override Type ExtensionType { get { return typeof(TraceExtension); } } /// summary /// 优先级 /// /summary public override int Priority { get { return priority; } set { priority value; } } /// summary /// 用于记录该WebMethod的SoapMessage的文件的绝对路径 /// 默认为c:\\log.txt; /// /summary public string Filename { get { return filename; } set { filename value; } } } } 结下来介绍一个如何使用该类: 如果要使让TraceExtension支持第一种记录方式需要作的额外工作为: 只需要在要记录SoapMessage的WebMethod添加如下的Attribute[TraceExtension(Filenamed:\\data.xml,Priority0)]当然路径您可以自己设定前一节的WebMethod就变成了添加了针对WebMethod日志记录的WebMethod public MySoapHeader header new MySoapHeader(); [WebMethod] [SoapHeader(header)] [TraceExtension(Filenamed:\\data.xml,Priority0)] public string HelloWorld() { if (header null) { return 您没有设置SoapHeader,不能正常访问此服务!; } if (header.UserName ! jillzhang || header.Pwd ! 123456) { return 您提供的身份验证信息有误不能正常访问此服务!; } return Hello World; } 调用下该WebService便在d盘产生一个data.xml文件里面的内容为:日志记录-----Soap请求 在 2007年05月25日 09时06分29秒?xml version1.0 encodingutf-8?soap:Envelope xmlns:soaphttp://schemas.xmlsoap.org/soap/envelope/ xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchemasoap:HeaderMySoapHeader xmlnshttp://tempuri.org/UserNamejillzhang/UserNamePwd123456/Pwd/MySoapHeader/soap:Headersoap:BodyHelloWorld xmlnshttp://tempuri.org/ //soap:Body/soap:Envelope-----Soap响应 在 2007年05月25日 09时06分29秒?xml version1.0 encodingutf-8?soap:Envelope xmlns:soaphttp://schemas.xmlsoap.org/soap/envelope/ xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:xsdhttp://www.w3.org/2001/XMLSchemasoap:BodyHelloWorldResponse xmlnshttp://tempuri.org/HelloWorldResultHello World/HelloWorldResult/HelloWorldResponse/soap:Body/soap:Envelope 如何采用第二种方法让WebService的每个WebMethod都能记录日志需要在Web.config中作如下的设定首先添加如下节点 webServices soapExtensionTypes add typeJillzhang.TraceExtension,Jillzhang priority1 groupHigh / /soapExtensionTypes /webServices 然后通过配置设定日志文件保留的路径 appSettings add keylogRoot valued:/ /appSettings 找到日志文件,里面也赫然有着SoapMessage的真面目。通过以上方法大家可以清晰地分析到SoapMessage的具体格式和内容知道了这个以后对付Web Service您就可以随心应手随心所欲如果你愿意你甚至也可以“强奸一次webservice,哈哈!上一篇文章地址构建安全的Xml Web Service系列一之初探使用Soap头 (5-22 12:53) 附终于买上房了虽然买的过程很累但现在还是很Happy!