<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Leven's Blog</title><subtitle type="text">只谈技术</subtitle><id>http://feed.cnblogs.com/blog/u/37850/rss</id><updated>2010-10-24T07:33:50Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/37850/rss"/><entry><id>http://www.cnblogs.com/leven/archive/2010/10/24/wcf-use-x509-file.html</id><title type="text">WCF开发-使用证书文件配置基于自定义X509证书验证的消息安全模式</title><summary type="text">    在基于互联网的wcf服务中，安全是非常重要的一环，在wcf中有着很多的安全模式，本次考虑在一个极限的服务器环境（比如虚拟主机）中配置使用证书文件配置自定义X509证书验证的消息安全模式。由于一般在这样的极限环境下，很难实现基于SSL的传输安全，因此我们考虑部署消息安全，同时服务器和客户端相互认证均使用X509证书。</summary><published>2010-10-24T07:34:00Z</published><updated>2010-10-24T07:34:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2010/10/24/wcf-use-x509-file.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2010/10/24/wcf-use-x509-file.html"/><content type="html">&lt;p&gt;在基于互联网的wcf服务中，安全是非常重要的一环，在wcf中有着很多的安全模式，本次考虑在一个极限的服务器环境（比如虚拟主机）中配置使用证书文件配置自定义X509证书验证的消息安全模式。由于一般在这样的极限环境下，很难实现基于SSL的传输安全，因此我们考虑部署消息安全，同时服务器和客户端相互认证均使用X509证书。&lt;/p&gt;&#xD;
&lt;p&gt;首先我们创建两个证书，Microsoft Visual Studio 2008--&amp;gt;Visual Studio Tools--&amp;gt;Visual Studio 2008 命令提示行，进入控制台，然后分别创建服务器证书和客户端证书，如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;makecert -r -pe -n "CN=TestServer" -e 08/10/2020 -sky exchange -ss mymakecert -r -pe -n "CN=TestClient" -e 08/10/2020 -sky exchange -ss my&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;执行之后如图:&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/34289/2010102415214712.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后进入证书管理将两个证书分别导出，导出的时候每个证书导出两次，分别导出为包含私钥的pfx文件和不包含私钥的cer文件，这样我们得到4个证书文件，我们命名为:TestServer.pfx,TestServer.cer,TestClient.pfx,TestClient.cer。 &lt;/p&gt;&#xD;
&lt;p&gt;这部分如下图:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/34289/2010102415220423.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/34289/2010102415221730.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面创建wcf服务端程序，&lt;/p&gt;&#xD;
&lt;p&gt;由于使用自定义证书认证，我们需要提供服务器端和客户端的认证程序，服务器端认证程序如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public class ServiceX509CertificateValidator : X509CertificateValidator {&#xD;
        public override void Validate(X509Certificate2 certificate) {&#xD;
            string path = HostingEnvironment.MapPath(WebConfig.ClientCertificate);&#xD;
            if (!File.Exists(path)) {&#xD;
                throw new FileNotFoundException(Path.GetFileName(path));&#xD;
            }&#xD;
            X509Certificate2 clientCertificate = new X509Certificate2(path);&#xD;
            //This is the Client  Certificate Thumbprint,In Production,We can validate the Certificate With CA&#xD;
            if (!certificate.Thumbprint.Equals(clientCertificate.Thumbprint, StringComparison.CurrentCultureIgnoreCase)) {&#xD;
                throw new SecurityTokenException("Unknown Certificate");&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;客户端认证程序如下:&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public class ClientX509CertificateValidator : X509CertificateValidator {&#xD;
        public override void Validate(X509Certificate2 certificate) {&#xD;
            //throw new NotImplementedException();&#xD;
            if (certificate == null) {&#xD;
                throw new ArgumentNullException("certificate");&#xD;
            }&#xD;
            string path = Path.GetFullPath(WebConfig.ServiceCertificate);&#xD;
            if (!File.Exists(path)) {&#xD;
                throw new FileNotFoundException(Path.GetFileName(path));&#xD;
            }&#xD;
            X509Certificate2 clientCertificate = new X509Certificate2(path);&#xD;
            //This is the Client  Certificate Thumbprint,In Production,We can validate the Certificate With CA&#xD;
            if (!certificate.Thumbprint.Equals(clientCertificate.Thumbprint, StringComparison.CurrentCultureIgnoreCase)) {&#xD;
                throw new SecurityTokenException("Unknown Certificate");&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这两个程序都是对证书的指纹进行验证。&lt;/p&gt;&#xD;
&lt;p&gt;下面开始对服务器端进行配置，首先建立新的Binding配置：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;bindings&amp;gt;&#xD;
      &amp;lt;wsHttpBinding&amp;gt;&#xD;
        &amp;lt;binding name="TestHttpBinding"&amp;gt;&#xD;
          &amp;lt;security mode="Message"&amp;gt;&#xD;
            &amp;lt;transport clientCredentialType="None"/&amp;gt;&#xD;
            &amp;lt;message clientCredentialType="Certificate"/&amp;gt;&#xD;
          &amp;lt;/security&amp;gt;&#xD;
        &amp;lt;/binding&amp;gt;&#xD;
      &amp;lt;/wsHttpBinding&amp;gt;&#xD;
    &amp;lt;/bindings&amp;gt;&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;然后修改Behavior配置：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;serviceBehaviors&amp;gt;&#xD;
        &amp;lt;behavior name="SecurityWcf.Service.TestServiceBehavior"&amp;gt;&#xD;
          &amp;lt;serviceMetadata httpGetEnabled="true" /&amp;gt;&#xD;
          &amp;lt;serviceDebug includeExceptionDetailInFaults="false" /&amp;gt;&#xD;
          &amp;lt;serviceCredentials&amp;gt;&#xD;
            &amp;lt;clientCertificate&amp;gt;&#xD;
              &amp;lt;authentication certificateValidationMode="Custom" customCertificateValidatorType="SecurityWcf.Core.ServiceX509CertificateValidator, SecurityWcf.Core"/&amp;gt;&#xD;
            &amp;lt;/clientCertificate&amp;gt;&#xD;
          &amp;lt;/serviceCredentials&amp;gt;&#xD;
        &amp;lt;/behavior&amp;gt;&#xD;
      &amp;lt;/serviceBehaviors&amp;gt;&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;最后将在当前测试服务加入binding配置&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;endpoint address="" binding="wsHttpBinding" contract="SecurityWcf.Service.ITestService" bindingConfiguration="TestHttpBinding"&amp;gt;&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;按照正常情况，程序需要配置服务器端证书，然而本文中由于采用了文件方式配置，因此必须使用程度动态处理，因此，我们创建了自己的ServiceHost，程序如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public class WcfServiceHostFactory : ServiceHostFactory {&#xD;
        public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses) {&#xD;
            ServiceHostBase host;&#xD;
            Uri baseUri;&#xD;
            if (!String.IsNullOrEmpty(WebConfig.ServiceUri) &amp;amp;&amp;amp;&#xD;
                Uri.TryCreate(WebConfig.ServiceUri, UriKind.RelativeOrAbsolute, out baseUri)) {&#xD;
                host = base.CreateServiceHost(constructorString, new Uri[] { baseUri });&#xD;
            } else {&#xD;
                host = base.CreateServiceHost(constructorString, baseAddresses);&#xD;
            }&#xD;
            if (WebConfig.EnableServiceCertificate) {&#xD;
                string path = System.Web.Hosting.HostingEnvironment.MapPath(WebConfig.ServiceCertificate);&#xD;
                if (!File.Exists(path)) {&#xD;
                    throw new FileNotFoundException(WebConfig.ServiceCertificate);&#xD;
                }&#xD;
                host.Credentials.ServiceCertificate.Certificate =&#xD;
                    new X509Certificate2(path, WebConfig.ServiceCertificatePassword, X509KeyStorageFlags.MachineKeySet);&#xD;
            }&#xD;
            return host;&#xD;
        }&#xD;
    }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这部分将根据配置文件自动在服务中加入证书支持，为了使用该部分，需要修改服务的svc文件，在头部配置上该ServiceHost，如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;%@ ServiceHost Language="C#" Debug="true" Service="SecurityWcf.Service.TestService" Factory="SecurityWcf.Core.WcfServiceHostFactory, SecurityWcf.Core" CodeBehind="TestService.svc.cs" %&amp;gt;&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;然后在web.config中配置好证书路径，在服务器端，需要用到TestServer.pfx和TestClient.cer。这部分配置文件如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;appSettings&amp;gt;&#xD;
    &amp;lt;add key="ServiceCertificate" value="~/config/TestServer.pfx"/&amp;gt;&#xD;
    &amp;lt;add key="ServiceCertificatePassword" value="123456"/&amp;gt;&#xD;
    &amp;lt;add key="EnableServiceCertificate" value="true"/&amp;gt;&#xD;
    &amp;lt;add key="ClientCertificate" value="~/config/TestClient.cer"/&amp;gt;&#xD;
  &amp;lt;/appSettings&amp;gt;&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;运行服务，如果没有错误提示，说明服务端已经成功运行，如图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/34289/2010102415272731.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面开始创建客户端程序，按照页面提示，我们来到vs command，执行svcutil.exe &lt;a href="http://localhost:2674/TestService.svc?wsdl"&gt;http://localhost:2674/TestService.svc?wsdl&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这样我们可以得到客户端源码，加入到客户端程序中，并将同时生成的output.config中的数据复制到项目中的app.config中。为了使用安全措施，必须在该文件中心在behavior部分，该部分如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;&amp;lt;behaviors&amp;gt;&#xD;
      &amp;lt;endpointBehaviors&amp;gt;&#xD;
        &amp;lt;behavior name="TestClientBehavior"&amp;gt;&#xD;
          &amp;lt;clientCredentials&amp;gt;&#xD;
            &amp;lt;serviceCertificate&amp;gt;&#xD;
              &amp;lt;authentication certificateValidationMode="Custom" customCertificateValidatorType="SecurityWcf.Core.ClientX509CertificateValidator, SecurityWcf.Core"/&amp;gt;&#xD;
            &amp;lt;/serviceCertificate&amp;gt;&#xD;
          &amp;lt;/clientCredentials&amp;gt;&#xD;
        &amp;lt;/behavior&amp;gt;&#xD;
      &amp;lt;/endpointBehaviors&amp;gt;&#xD;
    &amp;lt;/behaviors&amp;gt;&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;然后在客户端配置该behavior。客户端就可以使用证书验证了，在客户端程序中，我们创建一个factory类，创建连接对象，代码如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;public static class ServerClientFactory {&#xD;
        public static TestServiceClient CreateServerClient(string password) {&#xD;
            TestServiceClient client = new TestServiceClient();&#xD;
            string path = System.IO.Path.GetFullPath("config/TestClient.pfx");&#xD;
            client.ClientCredentials.ClientCertificate.Certificate&#xD;
                = new X509Certificate2(path, password, X509KeyStorageFlags.MachineKeySet);&#xD;
            return client;&#xD;
        }&#xD;
    }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样，我们就可以方便的使用连接对象了。测试主程序如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;class Program {&#xD;
        static void Main(string[] args) {&#xD;
            using (var context = ServerClientFactory.CreateServerClient("123456")) {&#xD;
                Console.WriteLine(context.GetSystemString());&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;执行，得到测试结果，如图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2010/34289/2010102415291119.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这样，我们成功配置了使用证书文件的基于X509消息安全的wcf，最后给出整个测试项目下载：&lt;br /&gt;&lt;img style="margin: 0px 2px -4px 0px;" src="http://leven.com.cn/skins/smixtrue/images/download.gif" alt="下载文件" /&gt;&lt;a title="点击下载此文件" href="http://leven.com.cn/blog/file?id=261" target="_blank"&gt;点击下载此文件&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leven/aggbug/1859768.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leven/archive/2010/10/24/wcf-use-x509-file.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leven/archive/2010/06/15/levenblog-cc.html</id><title type="text">levenblog一次被CC攻击的分析以及应对攻击记录</title><summary type="text">    前段时间，本站遭遇了一次CC攻击，具体攻击的原因未知，攻击持续时间大概在1天左右，攻击器使用了大量IP对本站进行了CC攻击，使得本站一度过载出现无法访问的情况，通过一番努力，在攻击开始后一段时间以后成功封堵了攻击者，本文简要记述了当日的攻击和防御过程，谨以为戒。</summary><published>2010-06-15T06:02:00Z</published><updated>2010-06-15T06:02:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2010/06/15/levenblog-cc.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2010/06/15/levenblog-cc.html"/><content type="html">&lt;p&gt;前段时间，本站遭遇了一次CC攻击，具体攻击的原因未知，攻击持续时间大概在1天左右，攻击器使用了大量IP对本站进行了CC攻击，使得本站一度过载出现无法访问的情况，通过一番努力，在攻击开始后一段时间以后成功封堵了攻击者，本文简要记述了当日的攻击和防御过程，谨以为戒。&lt;/p&gt;&#xD;
&lt;p&gt;首先给出本站的基本构架，本站采用asp.net mvc 1.0开发，基于sqlite数据库系统，部署在win2008+IIS7的系统上，本次攻击是典型的CC攻击，攻击者使用大量肉鸡发起大量无效http请求，而导致程序过载。&lt;/p&gt;&#xD;
&lt;p&gt;攻击大概在某天上午开始了，由于本站采用的sqlite为单文件数据库，在大并发情况下负载能力较低，对于一般blog程序自然是绰绰有余，但是在大量攻击的情况下，该数据库就无法充分利用系统资源了，在服务器cpu占用率在30%左右的时候，本站开始变得极为缓慢甚至出现程序执行错误，正常访问出现问题。&lt;/p&gt;&#xD;
&lt;p&gt;出现问题后，我进入服务器，发现流量达到5M左右，活动http连接在200以上，在此情况下，sqlite负载下的本程序显然已经无法正常服务，于是开始考虑应对方法。&lt;/p&gt;&#xD;
&lt;p&gt;对付CC攻击，一般采用防火墙封锁或者负载均衡的方式处理，负载均衡显然不太现实，因此，我们考虑采用防火墙系统封堵大量非法请求IP，win2008中自带了功能极为强大的防火墙系统，因此，我们使用它来封锁非法请求。&lt;/p&gt;&#xD;
&lt;p&gt;由于访问IP量巨大，因此，手动处理和辨别非法ip是不现实的，因此，我考虑使用程序分析攻击ip的方式，对iis日志访问记录进行详细分析，分析方法如下：&lt;/p&gt;&#xD;
&lt;p&gt;1.对当日的访问ip进行统计&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2.攻击者的典型特征是短时间多次连接，通过该方式，筛选出大量可疑IP&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3.对可疑IP进行分析，剔除搜索引擎蜘蛛IP&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5.最后剩下的基本上就是攻击者IP&lt;/p&gt;&#xD;
&lt;p&gt;通过以上方法，我们可以在较高精确度的情况下找出攻击者IP，通过对本次攻击的日志分析，在封堵大量攻击者IP之前，找到嫌疑度很高的IP988个。&lt;/p&gt;&#xD;
&lt;p&gt;然后需要做的就是在防火墙封堵这些IP，规则采用入站规则，这样，防火墙封堵将获得很高的效率，经过试验发现，windows防火墙一条规则大概可以封堵600多个单一IP，因此，我创建了两条规则，通过脚本，将这些可疑度很高的ip全部加入拒绝ip列表，完成之后，服务器流量和cpu占用率马上下降到正常水平。&lt;/p&gt;&#xD;
&lt;p&gt;在攻击过程中，经常出现攻击者攻击一段时间，停止一段时间，因此，我采用系统通知的方式，在服务器负载或者流量突然很大的时候进行通知，这样就可以在第一时间得知攻击情况并进行封堵。&lt;/p&gt;&#xD;
&lt;p&gt;在一天以后，攻击停止，我解开了这两条规则，由于攻击者经常使用合法ip进行攻击，因此这些ip的用户也很可能访问本站，因此在攻击停止之后需要解开规则。&lt;/p&gt;&#xD;
&lt;p&gt;本次规则，共出现攻击ip&lt;span style="color: #f00;"&gt;998&lt;/span&gt;个，在封堵之前，攻击次数最多的ip202.108.xxx.xxx进行了&lt;span style="color: #f00;"&gt;1401&lt;/span&gt;此攻击连接，最少的攻击IP189.31.xxx.xxx进行了&lt;span style="color: #f00;"&gt;11&lt;/span&gt;次攻击连接，在攻击停止之后，再次对日志进行分析，共产生&lt;span style="color: #f00;"&gt;116494&lt;/span&gt;次攻击访问请求，同时将系统最高在线人数刷新到&lt;span style="color: #f00;"&gt;331&lt;/span&gt;人，考虑在攻击不久之后便封堵了大量攻击IP，因此本次攻击量还是比较大的。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leven/aggbug/1758611.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leven/archive/2010/06/15/levenblog-cc.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leven/archive/2010/05/13/decoratorsharp-aop-demo01.html</id><title type="text">初试轻量级AOP框架 DecoratorSharp-另类的Hello World</title><summary type="text">   DecoratorSharp是一个轻量级的AOP框架，它的创造灵感来自python的decorator，通过目前提供的0.2.0版本，我们可以轻松使用该框架进行切面编程。本文通过一个简单的Demo来看看如何简单的使用这一框架，同时，本文也是上次未完结文章《轻量级AOP框架-移植python的装饰器(Decorator)到C#》的续集。注意，目前的DecoratorSharp还在开发中，API有可能仍然变动，因此在最终版本出现之后，本文可能仅能作为参考。 </summary><published>2010-05-13T14:43:00Z</published><updated>2010-05-13T14:43:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2010/05/13/decoratorsharp-aop-demo01.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2010/05/13/decoratorsharp-aop-demo01.html"/><content type="html">&lt;p&gt;DecoratorSharp是一个轻量级的AOP框架，它的创造灵感来自python的decorator，通过目前提供的0.2.0版本，我们可以轻松使用该框架进行切面编程。本文通过一个简单的Demo来看看如何简单的使用这一框架，同时，本文也是上次未完结文章《&lt;a href="http://leven.com.cn/blog/view/93/1"&gt;轻量级AOP框架-移植python的装饰器(Decorator)到C#》&lt;/a&gt;的续集。注意，目前的DecoratorSharp还在开发中，API有可能仍然变动，因此在最终版本出现之后，本文可能仅能作为参考。 &lt;/p&gt;&#xD;
&lt;p&gt;为了使用DecoratorSharp，我们首选前往官网下载该框架，官网的地址为：&lt;a href="http://decoratorsharp.com/"&gt;http://decoratorsharp.com/&lt;/a&gt;,在首页的醒目位置，我们可以看到最新版框架的下载，当前最新为0.2.0，在使用的时候，我们仅需要二进制文件即可，下载之后解压，我们可以在bin目录中找到库文件DecoratorSharp.dll。&lt;/p&gt;&#xD;
&lt;p&gt;创建一个vs的控制台项目，将DecoratorSharp.dll复制到项目中，然后将该dll加入到项目引用，完成之后大致如图所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/leven/201005/2010051322350437.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后我们新增一个类TestAttribute，其代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/leven/201005/2010051322354358.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后新建一个TestClass，在Hello方法上应用这个TestAttribute，此处需要注意，由于目前的DecoratorSharp是用Proxy实现的，因此，要求TestClass必须是公共，可继承的类，同时Hello必须是virtual方法。完成之后的代码如下所示：&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/img/leven/201005/2010051322361429.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后在&lt;span&gt;Program.cs&lt;/span&gt;中进行测试，详细代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/img/leven/201005/2010051322365218.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后执行，我们可以看到执行的结果:&lt;br /&gt;&lt;img src="http://pic002.cnblogs.com/img/leven/201005/2010051322371565.png" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;看到了运行结果，我们再回过头来看看整个程序的执行，Hello方法只是一个返回string的普通方法，然而，在执行的时候，控制台却打印了&amp;ldquo;Hello,World&amp;rdquo;这样的字符串，很显然，我们创建的TestClass对象不再是原始的TestClass类的对象，在DecoratorSharp框架内部，将其进行了修改，从而导致了TestAttribute中的Execute方法被执行了。因此，目前我们可以简单的认为，DecoratorSharp构造的新对象在执行Hello方法的时候执行了TestAttribute的Execute方法返回的委托对象。 &lt;/p&gt;&#xD;
&lt;p&gt;在后续的文章中我会更详细的现实DecoratorSharp的一些特性和运行原理。&lt;/p&gt;&#xD;
&lt;p&gt;最后给出本次Demo的全部源码:&lt;img src="http://leven.com.cn/skins/inove/images/download.gif" alt="下载文件" style="margin: 0px 2px -4px 0px;" /&gt;&lt;a target="_blank" href="http://www.cnblogs.com/blog/file?id=246" title="点击下载此文件"&gt;点击下载此文件&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;您还可以通过访问：&lt;a href="http://leven.com.cn/blog/view/111/1"&gt;http://leven.com.cn/blog/view/111/1&lt;/a&gt;来阅读本文，&lt;a href="http://leven.com.cn"&gt;http://leven.com.cn&lt;/a&gt;是作者的个人blog，如果您对DecoratorSharp感兴趣，可以经常关注以获得最新状况。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leven/aggbug/1734960.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leven/archive/2010/05/13/decoratorsharp-aop-demo01.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leven/archive/2010/05/09/decorator-preview.html</id><title type="text">DecoratorSharp主页上线,提供第一个preview版本测试</title><summary type="text">去年年底到今年年初的时候,书写了两篇关于c#实现python的decorator的文章,由于时间和精力的原因,该系列还未完结,但是decoratorsharp项目却是完成了第一个可用的预览版,虽然在效率和api设计上还有些问题,但总算是没有bug了.现做了一个DecoratorSharp的官网,并放出库和源代码测试.</summary><published>2010-05-09T12:23:00Z</published><updated>2010-05-09T12:23:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2010/05/09/decorator-preview.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2010/05/09/decorator-preview.html"/><content type="html">&lt;p&gt;去年年底到今年年初的时候,书写了两篇关于c#实现python的decorator的文章,由于时间和精力的原因,该系列还未完结,但是decoratorsharp项目却是完成了第一个可用的预览版,虽然在效率和api设计上还有些问题,但总算是没有bug了.现做了一个DecoratorSharp的官网,并放出库和源代码测试.&lt;/p&gt;&#xD;
&lt;p&gt;官网地址:&lt;a href="http://decoratorsharp.com/"&gt;http://decoratorsharp.com&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;库文件和源码获取:请直接前往官网获取.&lt;/p&gt;&#xD;
&lt;p&gt;DecoratorSharp是一个很容易使用的开源.net AOP框架,目前实现了dynamic proxy模式,目标是同时实现dynamic proxy和static的注入模式,设计简单高效,功能完全等同于python的decorator特性.&lt;/p&gt;&#xD;
&lt;p&gt;本文原始地址:&lt;a href="http://leven.com.cn/blog/view/109/1"&gt;http://leven.com.cn/blog/view/109/1&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leven/aggbug/1731290.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leven/archive/2010/05/09/decorator-preview.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leven/archive/2010/04/24/debian-vpn-pptp.html</id><title type="text">在Debian上建立基于PPTP的VPN</title><summary type="text">VPN的英文全称是&amp;ldquo;Virtual Private Network&amp;rdquo;，翻译过来就是&amp;ldquo;虚拟专用网络&amp;rdquo;。顾名思义，虚拟专用网络可以把它理解成是虚拟出来的企业内部专线。 今天我们的目的是在自己的debian系统上构造一个VPN系统,废话不多说,下面开始配置系统. .... 本文详细内容请参考:http://leven.com.cn/blog/view/10...</summary><published>2010-04-24T08:32:00Z</published><updated>2010-04-24T08:32:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2010/04/24/debian-vpn-pptp.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2010/04/24/debian-vpn-pptp.html"/><content type="html">&lt;p&gt;VPN的英文全称是&amp;ldquo;Virtual Private Network&amp;rdquo;，翻译过来就是&amp;ldquo;虚拟专用网络&amp;rdquo;。顾名思义，虚拟专用网络可以把它理解成是虚拟出来的企业内部专线。&lt;/p&gt;&#xD;
&lt;p&gt;今天我们的目的是在自己的debian系统上构造一个VPN系统,废话不多说,下面开始配置系统.&lt;/p&gt;&#xD;
&lt;p&gt;....&lt;/p&gt;&#xD;
&lt;p&gt;本文详细内容请参考:&lt;a href="http://leven.com.cn/blog/view/106/1"&gt;http://leven.com.cn/blog/view/106/1&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leven/aggbug/1719395.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leven/archive/2010/04/24/debian-vpn-pptp.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leven/archive/2010/03/29/wcf-rest-routing.html</id><title type="text">为WCF REST启用UrlRouting</title><summary type="text">    在基于Rest的WCF开发中,我们有必要将原来的/xxx.svc/xxx的Url更改为/xxx/xxx,在WCF4中,使用Asp.Net模式可以通过System.Web.Routing组件来完成这一操作.本文将简要给出实现方法.</summary><published>2010-03-29T15:38:00Z</published><updated>2010-03-29T15:38:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2010/03/29/wcf-rest-routing.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2010/03/29/wcf-rest-routing.html"/><content type="html">&lt;p&gt;在基于Rest的WCF开发中,我们有必要将原来的/xxx.svc/xxx的Url更改为/xxx/xxx,在WCF4中,使用Asp.Net模式可以通过System.Web.Routing组件来完成这一操作.&lt;/p&gt;&#xD;
&lt;p&gt;首先,在项目中引用Syste.Web.Routing和System.ServiceModel.Activation这两个程序集,然后修改web.config配置,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1.修改system.webserver节点,增加modules&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div onclick="cnblogs_code_show('f50ed979-069a-469f-9347-185acbd0797e')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div id="cnblogs_code_open_f50ed979-069a-469f-9347-185acbd0797e"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.webServer&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  &lt;br /&gt;&lt;br /&gt;2    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;modules &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;runAllManagedModulesForAllRequests&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  &lt;br /&gt;&lt;br /&gt;3      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;add &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="UrlRoutingModule"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="System.Web.Routing.UrlRoutingModule,  &lt;br /&gt;&lt;br /&gt;4            System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  &lt;br /&gt;&lt;br /&gt;5    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;modules&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;  &lt;br /&gt;&lt;br /&gt;6   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;system.webServer&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;2.修改serviceHostingEnvironment,启用asp.net模式&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;serviceHostingEnvironment &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;multipleSiteBindingsEnabled&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; aspNetCompatibilityEnabled&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="true"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后修改Global.ascx中的数据:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div onclick="cnblogs_code_show('761766f0-ac8b-402d-8d3d-4f309636248c')" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div id="cnblogs_code_open_761766f0-ac8b-402d-8d3d-4f309636248c"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Application_Start(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e) {  &lt;br /&gt;&lt;br /&gt;             RegisterRoutes();  &lt;br /&gt;&lt;br /&gt;         }  &lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;         &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterRoutes() {  &lt;br /&gt;&lt;br /&gt;             RouteTable.Routes.Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceRoute(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;TestService&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,  &lt;br /&gt;&lt;br /&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; WebServiceHostFactory(), &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(TestService)));  &lt;br /&gt;&lt;br /&gt;         } &lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后修改Service文件,以支持该模式:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #000000;"&gt;    [AspNetCompatibilityRequirements(RequirementsMode &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; AspNetCompatibilityRequirementsMode.Allowed)]  &lt;br /&gt;&lt;br /&gt;    [ServiceBehavior(InstanceContextMode &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; InstanceContextMode.PerCall)] &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/leven/aggbug/1700120.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leven/archive/2010/03/29/wcf-rest-routing.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leven/archive/2010/02/28/1675202.html</id><title type="text">管理linux服务器的一些tips</title><summary type="text">    前几天将本站迁往了linux服务器上,测试的情况看来,除了由于线路原因刷新速度略显慢之外倒没有其他可挑剔的地方.在管理linux服务器的时候个人整理了一些tips.</summary><published>2010-02-28T09:31:00Z</published><updated>2010-02-28T09:31:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2010/02/28/1675202.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2010/02/28/1675202.html"/><content type="html">&lt;p&gt;前几天将本站&lt;a href="http://leven.com.cn/blog/view/97"&gt;迁往了linux服务器&lt;/a&gt;上,测试的情况看来,除了由于线路原因刷新速度略显慢之外倒没有其他可挑剔的地方.在管理linux服务器的时候个人整理了一些tips.&lt;/p&gt;&#xD;
&lt;p&gt;1.由于某些原因如果到时ssh断掉,服务器会保留以前登陆的账号很长时间,这时候可以使用&lt;/p&gt;&#xD;
&lt;p&gt;&lt;code &gt;skill -KILL -&lt;/code&gt;&lt;code &gt;v&lt;/code&gt; &lt;code &gt;/pts/xx&lt;/code&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;来踢掉断线用户,其中/pts/xx可以使用w命令进行查看&lt;/p&gt;&#xD;
&lt;p&gt;2.查看进程,系统负载,内存使用等情况,使用top命令&lt;/p&gt;&#xD;
&lt;p&gt;3.查看详细的内存使用信息,使用free命令,同时可选-m等参数&lt;/p&gt;&#xD;
&lt;p&gt;4.查看磁盘剩余情况,使用df命令同时可选-h等参数&lt;/p&gt;&#xD;
&lt;p&gt;5.查看inode剩余情况,使用df -i命令&lt;/p&gt;&#xD;
&lt;p&gt;6.查看详细进程信息,使用ps aux命令&lt;/p&gt;&#xD;
&lt;p&gt;7.查看进程树信息,使用pstree命令,可选-p -u等参数&lt;/p&gt;&#xD;
&lt;p&gt;8.编辑文本文件,可安装vim或者nano,个人更习惯vim&lt;/p&gt;&#xD;
&lt;p&gt;9.退出ssh,使用exit或者ctrl+d&lt;/p&gt;&#xD;
&lt;p&gt;10.关闭服务器,使用shutdown -h,重启服务器,使用reboot命令&lt;/p&gt;&#xD;
&lt;p&gt;11.结束进程,使用kill命令,或者使用killall直接结束其进程树&lt;/p&gt;&#xD;
&lt;p&gt;12.查看详细的cpu信息,使用cat /proc/cpuinfo&lt;/p&gt;&#xD;
&lt;p&gt;13.查看详细内存信息,使用cat /proc/memory&lt;/p&gt;&#xD;
&lt;p&gt;14.查看端口开放情况,使用netstat -ntl查看&lt;/p&gt;&#xD;
&lt;p&gt;15.查看80端口连接ip列表信息,使用netstat -ntl | grep "80"&lt;/p&gt;&#xD;
&lt;p&gt;暂时总结到这儿,上面算是日常登陆服务器经常会用到的命令了.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/leven/aggbug/1675202.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/leven/archive/2010/02/28/1675202.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/leven/archive/2010/01/14/mono-levenblog.html</id><title type="text">以levenblog为例,尝试在linux+mono平台上部署asp.net mvc程序</title><summary type="text">    一直以来都十分关注mono的发展,在不久之前,mono正式发布了2.6.1版本,该版本已经是一个比较完善的版本了,不仅完整支持了.net2.0的全部内容,以及大部分.net3.5甚至还支持了.net4.0的内容(可选),在mono官方已经包含了asp.net mvc1.0版本,因此,部署levenblog到mono的条件完全成熟,不过由于linux和windows的差异,因此,也并不是所有程序都可以直接部署的,本次将完整记录levenblog部署到mono2.6.1的过程.</summary><published>2010-01-13T16:03:00Z</published><updated>2010-01-13T16:03:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2010/01/14/mono-levenblog.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2010/01/14/mono-levenblog.html"/></entry><entry><id>http://www.cnblogs.com/leven/archive/2009/12/28/decorator-csharp-2.html</id><title type="text">轻量级AOP框架-移植python的装饰器(Decorator)到C#(编码篇)</title><summary type="text">    在《轻量级AOP框架-移植python的装饰器(Decorator)到C#(思考篇)》中，文章分析了Python中Decorator的原理以及C#移植的可行性，在本篇中，文章将继续探讨如何将这个想法实实在在的表现出来，因此本篇的目标是：一个初级但是可用的Decorator实现。     如果您对本文的基本思路存在疑惑，请先阅读思考篇。 </summary><published>2009-12-28T09:25:00Z</published><updated>2009-12-28T09:25:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2009/12/28/decorator-csharp-2.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2009/12/28/decorator-csharp-2.html"/></entry><entry><id>http://www.cnblogs.com/leven/archive/2009/12/28/decorator-csharp-1.html</id><title type="text">轻量级AOP框架-移植python的装饰器(Decorator)到C#(思考篇)</title><summary type="text">今天我们展示的是Python中一个很有用特性：“Decorator”，中文可以译作“装饰器”，它是一个对函数的封装，它可以让你不改变函数本身的情况下对函数的执行进行干预，比如在执行前进行权限认证，日志记录，甚至修改传入参数，或者在执行后对返回结果进行预处理，甚至可以截断函数的执行等等,没错，本质上来说，它就是我们常说的面向方面编程（Aspect-Oriented Programming），简称AOP，本文将尝试将这一特性移植到c#平台.</summary><published>2009-12-28T04:22:00Z</published><updated>2009-12-28T04:22:00Z</updated><author><name>Leven</name><uri>http://www.cnblogs.com/leven/</uri></author><link rel="alternate" href="http://www.cnblogs.com/leven/archive/2009/12/28/decorator-csharp-1.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/leven/archive/2009/12/28/decorator-csharp-1.html"/></entry></feed>
