<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_zwwon</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/19248/rss</id><updated>2010-09-20T03:44:44Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/19248/rss"/><entry><id>http://www.cnblogs.com/zwwon/archive/2010/05/07/1729333.html</id><title type="text">IIS中加入piwik跟踪代码</title><summary type="text">好久没来写博了...今天写一下如何在IIS中加入piwik跟踪代码。背景：• piwik 开源php站点统计程序 http://piwik.org• HttpModule： http://www.cnblogs.com/stwyhm/archive/2006/08/09/471729.html实现思路：通过HttpModule在aspx页面的body前加入统计代码。代码实现： 1. 新建dll项目...</summary><published>2010-05-06T16:05:00Z</published><updated>2010-05-06T16:05:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2010/05/07/1729333.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2010/05/07/1729333.html"/><content type="html">&lt;p&gt;好久没来写博了...&lt;br&gt;今天写一下如何在IIS中加入piwik跟踪代码。&lt;br&gt;背景：&lt;br&gt;•&amp;nbsp;&amp;nbsp;&amp;nbsp; piwik 开源php站点统计程序&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://piwik.org"&gt;http://piwik.org&lt;/a&gt;&lt;br&gt;•&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpModule： &lt;a href="http://www.cnblogs.com/stwyhm/archive/2006/08/09/471729.html"&gt;http://www.cnblogs.com/stwyhm/archive/2006/08/09/471729.html&lt;/a&gt;&lt;br&gt;实现思路：通过HttpModule在aspx页面的body前加入统计代码。&lt;br&gt;代码实现：&lt;/p&gt; &lt;p&gt;1. 新建dll项目&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;pre &gt;using System;&#xD;
using System.Data;&#xD;
using System.Configuration;&#xD;
using System.Web;&#xD;
using System.Web.Security;&#xD;
using System.Web.UI;&#xD;
using System.Web.UI.WebControls;&#xD;
using System.Web.UI.WebControls.WebParts;&#xD;
using System.Web.UI.HtmlControls;&#xD;
using System.IO; &#xD;
&#xD;
namespace PiwikAnalytics&#xD;
{&#xD;
    /// 修改于网上流传的Google Analytics (https://www.google.com/analytics/) script    &#xD;
    public class PiwikAnalyticsModule : IHttpModule&#xD;
    {&#xD;
        static string GoogleScript = string.Empty;&#xD;
        HttpApplication application; &#xD;
&#xD;
        public void Dispose()&#xD;
        {&#xD;
            //context.BeginRequest -= new EventHandler(OnBeginRequest);&#xD;
        } &#xD;
&#xD;
        public void Init(HttpApplication context)&#xD;
        {&#xD;
            context.BeginRequest += new EventHandler(OnBeginRequest);&#xD;
            application = context;&#xD;
        } &#xD;
&#xD;
        void OnBeginRequest(object sender, EventArgs e)&#xD;
        {&#xD;
            HttpApplication application = (HttpApplication)sender;&#xD;
            //web.config中定义的站点字符串，后面会有介绍&#xD;
            string sites = ConfigurationManager.AppSettings["PiwikAnalyticsSites"];&#xD;
            //此处未进行异常处理,大家发布时记得加上哦~&#xD;
            string[] siteArr = sites.Split(';');&#xD;
            string siteid = "5";&#xD;
            foreach (string site in siteArr)&#xD;
            {&#xD;
                if (application.Request.Url.OriginalString.ToLower().IndexOf(site.Split(',')[0]) &amp;gt; 0)&#xD;
                {&#xD;
                    siteid = site.Split(',')[1];&#xD;
                }&#xD;
            } &#xD;
&#xD;
            GoogleScript = @" &amp;lt;!-- Piwik --&amp;gt;&#xD;
             &amp;lt;script type=""text/javascript""&amp;gt;&#xD;
        var pkBaseURL = ((""https:"" == document.location.protocol) ? ""https://yourpiwik.com/piwik/"" : ""http://yourpiwik.com/piwik/"");&#xD;
        document.write(unescape(""%3Cscript src='"" + pkBaseURL + ""piwik.js' type='text/javascript'%3E%3C/script%3E""));&#xD;
    &amp;lt;/script&amp;gt; &#xD;
&#xD;
    &amp;lt;script type=""text/javascript""&amp;gt;&#xD;
        //try {          &#xD;
            var piwikTracker = Piwik.getTracker(pkBaseURL + ""piwik.php"", " + siteid + @");           &#xD;
            piwikTracker.trackPageView();&#xD;
            piwikTracker.enableLinkTracking();&#xD;
        //} catch (err) { }&#xD;
    &amp;lt;/script&amp;gt; &#xD;
&#xD;
    &amp;lt;noscript&amp;gt;&#xD;
        &amp;lt;p&amp;gt;&#xD;
            &amp;lt;img id=""img1"" src=""http://pm.taobao.ali.com/piwik/piwik.php?idsite="+siteid+@""" style=""border: 0"" alt="""" /&amp;gt;&amp;lt;/p&amp;gt;&#xD;
    &amp;lt;/noscript&amp;gt;&#xD;
            &amp;lt;!-- End Piwik Tag --&amp;gt;"; &#xD;
&#xD;
            //这里需要针对ASPX页面进行拦截&#xD;
            string[] temp = application.Request.CurrentExecutionFilePath.Split('.');&#xD;
            if (temp.Length &amp;gt; 0 &amp;amp;&amp;amp; temp[temp.Length - 1].ToLower() == "aspx")&#xD;
            {&#xD;
                application.Response.Filter = new AnalyticsStream(application.Response.Filter);&#xD;
            }&#xD;
        } &#xD;
&#xD;
        class AnalyticsStream : Stream&#xD;
        {&#xD;
            Stream innerStream;          &#xD;
            MemoryStream memory = new MemoryStream(); &#xD;
&#xD;
            public AnalyticsStream(Stream innerStream)&#xD;
            {&#xD;
                this.innerStream = innerStream;            &#xD;
            } &#xD;
&#xD;
            public override void Close()&#xD;
            {&#xD;
                memory.Position = 0;&#xD;
                using (StreamWriter writer = new StreamWriter(innerStream))&#xD;
                {&#xD;
                    using (StreamReader reader = new StreamReader(memory))&#xD;
                    {&#xD;
                        while (!reader.EndOfStream)&#xD;
                        {&#xD;
                            // Find &amp;lt;/body&amp;gt;&#xD;
                            if (MatchesOrWrite(reader, writer, '&amp;lt;', null) &amp;amp;&amp;amp;&#xD;
                                MatchesOrWrite(reader, writer, '/', "&amp;lt;") &amp;amp;&amp;amp;&#xD;
                                MatchesOrWrite(reader, writer, 'b', "&amp;lt;/") &amp;amp;&amp;amp;&#xD;
                                MatchesOrWrite(reader, writer, 'o', "&amp;lt;/b") &amp;amp;&amp;amp;&#xD;
                                MatchesOrWrite(reader, writer, 'd', "&amp;lt;/bo") &amp;amp;&amp;amp;&#xD;
                                MatchesOrWrite(reader, writer, 'y', "&amp;lt;/bod") &amp;amp;&amp;amp;&#xD;
                                MatchesOrWrite(reader, writer, '&amp;gt;', "&amp;lt;/body"))&#xD;
                            {&#xD;
                                //string script = String.Format(GoogleScript, accountNumber) + "&amp;lt;/body&amp;gt;";&#xD;
                                writer.Write(GoogleScript);&#xD;
                                while (!reader.EndOfStream)&#xD;
                                    writer.Write((char)reader.Read());&#xD;
                            }&#xD;
                        }&#xD;
                    }&#xD;
                } &#xD;
&#xD;
                base.Close();&#xD;
            } &#xD;
&#xD;
            private bool MatchesOrWrite(StreamReader reader, StreamWriter writer, char target, string buffered)&#xD;
            {&#xD;
                if (!reader.EndOfStream)&#xD;
                {&#xD;
                    char current = (char)reader.Read();&#xD;
                    if (current == target)&#xD;
                    {&#xD;
                        return true;&#xD;
                    }&#xD;
                    else&#xD;
                    {&#xD;
                        writer.Write(buffered);&#xD;
                        writer.Write(current);&#xD;
                    }&#xD;
                }&#xD;
                else&#xD;
                {&#xD;
                    writer.Write(buffered);&#xD;
                } &#xD;
&#xD;
                return false;&#xD;
            } &#xD;
&#xD;
            public override bool CanRead&#xD;
            {&#xD;
                get { return memory.CanRead; }&#xD;
            } &#xD;
&#xD;
            public override bool CanSeek&#xD;
            {&#xD;
                get { return memory.CanSeek; }&#xD;
            } &#xD;
&#xD;
            public override bool CanWrite&#xD;
            {&#xD;
                get { return memory.CanWrite; }&#xD;
            } &#xD;
&#xD;
            public override void Flush()&#xD;
            {&#xD;
                memory.Flush();&#xD;
            } &#xD;
&#xD;
            public override long Length&#xD;
            {&#xD;
                get { return memory.Length; }&#xD;
            } &#xD;
&#xD;
            public override long Position&#xD;
            {&#xD;
                get&#xD;
                {&#xD;
                    return memory.Position;&#xD;
                }&#xD;
                set&#xD;
                {&#xD;
                    memory.Position = value;&#xD;
                }&#xD;
            } &#xD;
&#xD;
            public override int Read(byte[] buffer, int offset, int count)&#xD;
            {&#xD;
                return memory.Read(buffer, offset, count);&#xD;
            } &#xD;
&#xD;
            public override long Seek(long offset, SeekOrigin origin)&#xD;
            {&#xD;
                throw new NotImplementedException();&#xD;
            } &#xD;
&#xD;
            public override void SetLength(long value)&#xD;
            {&#xD;
                memory.SetLength(value);&#xD;
            } &#xD;
&#xD;
            public override void Write(byte[] buffer, int offset, int count)&#xD;
            {&#xD;
                memory.Write(buffer, offset, count);&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
} &#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;2. &lt;br&gt;编译得到PiwikAnalytics.dll，注册到GAC中【需要强命名的哦~】，不然要每个子站点都拷贝一份。&lt;br&gt;如何在visual studio中强命名程序集：（推荐）&amp;nbsp; &lt;a href="http://www.cnblogs.com/awpatp/archive/2010/02/07/1665530.html"&gt;http://www.cnblogs.com/awpatp/archive/2010/02/07/1665530.html&lt;/a&gt;&lt;br&gt;文章中也提到了如果获取程序集的PublicKeyToken，其实不用那么麻烦，把程序集放到GAC中，有一列会显示PublicKeyToken的~。&lt;br&gt;•&amp;nbsp;&amp;nbsp;&amp;nbsp; GAC注册：&lt;a href="http://www.cnblogs.com/mljmalongjiang/archive/2008/07/31/1257135.html"&gt;http://www.cnblogs.com/mljmalongjiang/archive/2008/07/31/1257135.html&lt;/a&gt;&lt;br&gt;•&amp;nbsp;&amp;nbsp;&amp;nbsp; 另外有种更简便的方式，直接把dll托到 c:\windows\assembly文件夹中【推荐】&lt;br&gt;另外一种方式强命名程序集：&lt;a href="http://www.cnblogs.com/zhongge/articles/1207183.html"&gt;http://www.cnblogs.com/zhongge/articles/1207183.html&lt;/a&gt;&lt;br&gt;经过上述步骤，我们已经把PiwikAnalytics.dll注册到GAC了，那我们在web.config中做一下配置就要大功告成了！&lt;br&gt;3. web.config默认路径C:\inetpub\wwwroot，如果没有web.config可直接新建的~&lt;br&gt;&lt;pre &gt;&amp;lt;?xml version="1.0"?&amp;gt;&#xD;
&amp;lt;configuration&amp;gt;&#xD;
  &amp;lt;appSettings&amp;gt;&#xD;
    &amp;lt;add key="PiwikAnalyticsSites" value="site,4;meeting,6"/&amp;gt;    &#xD;
  &amp;lt;/appSettings&amp;gt;&#xD;
  &amp;lt;system.web&amp;gt;    &#xD;
    &amp;lt;authentication mode="Windows"/&amp;gt;&#xD;
    &amp;lt;httpModules&amp;gt;&#xD;
      &amp;lt;add name="PiwikAnalytics" type="PiwikAnalytics.PiwikAnalyticsModule"/&amp;gt;&#xD;
    &amp;lt;/httpModules&amp;gt;&#xD;
    &amp;lt;compilation debug="true"&amp;gt;&#xD;
      &amp;lt;assemblies&amp;gt;&#xD;
        &amp;lt;add assembly="PiwikAnalytics, version=1.0.0.0, Culture=neutral,PublicKeyToken=0c64deee0d840dfb" /&amp;gt;&#xD;
      &amp;lt;/assemblies&amp;gt;&#xD;
    &amp;lt;/compilation&amp;gt;&#xD;
  &amp;lt;/system.web&amp;gt;&#xD;
&amp;lt;/configuration&amp;gt; &lt;/pre&gt;&#xD;
&lt;p&gt;要记得把从步骤2中得到的PublicKeyToken替换成你自己的哦~&lt;br&gt;到此时，重启iis，刷新页面。再去piwik中查看，大功告成！&lt;br&gt;需特别注意的地方：&lt;br&gt;1.&amp;nbsp;&amp;nbsp;&amp;nbsp; 注册module时，要按照自己的实际情况配置&lt;br&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp; 上述方式不适用于MVC和模板模式开发&lt;br&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp; 每次改写代码的时候都需要重新生成一次DLL，并且重新注册GAC，并且对站点相应应用程序池中的进行回收&lt;br&gt;More：另外介绍2个pwiki客户端查看软件&lt;br&gt;•&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.desktop-web-analytics.com/"&gt;Desktop Web Analytics&lt;/a&gt;&lt;br&gt;•&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.piwik-connector.com/en/"&gt;Piwik Connector&lt;/a&gt;&lt;br&gt;Over 收工!&lt;/p&gt;&lt;img src="http://www.cnblogs.com/zwwon/aggbug/1729333.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/zwwon/archive/2010/05/07/1729333.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/11/30/1613933.html</id><title type="text">注册表中启用对没有标记为安全的 ActiveX 控件进行初始化和脚本运行</title><summary type="text">启用对没有标记为安全的 ActiveX 控件进行初始化和脚本运行找到注册表项HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\0修改 1201 项值为0微软参考： Internet Explorer 安全区域注册表项说明</summary><published>2009-11-30T09:35:00Z</published><updated>2009-11-30T09:35:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/11/30/1613933.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/11/30/1613933.html"/></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/11/27/1612181.html</id><title type="text">安装Qvode后，在IE8的菜单工具中会出现《彩票》</title><summary type="text">删除这个《彩票》，看的不爽！找到指定注册表节，删除HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\Extensions\{82D9671E-0B56-4285-92CD-15BC08B883BB}关闭IE，然后再打开就好了</summary><published>2009-11-27T09:11:00Z</published><updated>2009-11-27T09:11:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/11/27/1612181.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/11/27/1612181.html"/></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/11/11/1600789.html</id><title type="text">将字符串写入图片</title><summary type="text">将字符串写入到图片中.1 换行采用指定写入位置来实现2务必释放资源,否则会出现Win32Error[代码]</summary><published>2009-11-11T03:22:00Z</published><updated>2009-11-11T03:22:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/11/11/1600789.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/11/11/1600789.html"/></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/10/19/1586143.html</id><title type="text">TRUNCATE 删除表内所有记录</title><summary type="text">今天删除一个数据库中的记录，数据有400万条，删的都怕了，忽然间想起来有个删除语句。终于找到了，可还是无法满足我的要求，TRUNCATE 是清空所有记录。抄下来备查了~TRUNCATE TABLE删除表中的所有行，而不记录单个行删除操作。 语法TRUNCATE TABLE name参数name是要截断的表的名称或要删除其全部行的表的名称。注释TRUNCATE TABLE 在功能上与不带 WHERE...</summary><published>2009-10-19T10:36:00Z</published><updated>2009-10-19T10:36:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/10/19/1586143.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/10/19/1586143.html"/></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/09/25/1573814.html</id><title type="text">Windows Server 2003 SP1本机访问报错-环回检查</title><summary type="text">搭建好的程序本机无法正常访问，返回HTTP401.1错误。客户端却能正常访问如果安装 Microsoft Windows Server 2003 Service Pack 1 (SP1)，则会出现此问题。Windows Server 2003 SP1 包括一个环回检查安全功能，用于帮助防止计算机受到反射攻击。因此，如果所使用的 FQDN 或自定义的主机标头与本地计算机名称不匹配，则会出现身份验证失...</summary><published>2009-09-25T02:23:00Z</published><updated>2009-09-25T02:23:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/09/25/1573814.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/09/25/1573814.html"/></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/06/26/1511426.html</id><title type="text">通过Object传递参数</title><summary type="text">Tip: How to pass initialize parameters to Silverlight application using &amp;lt;object&amp;gt; element? If you want to pass initialize parameters to Silverlight application from an HTML/ASPX page, you have to...</summary><published>2009-06-26T02:01:00Z</published><updated>2009-06-26T02:01:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/06/26/1511426.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/06/26/1511426.html"/></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/05/14/1456834.html</id><title type="text">SQL Server 镜像部署</title><summary type="text">数据库镜像配置参考资料:http://tech.it168.com/db/s/2007-04-24/200704240837593_1.shtml用SQL命令方式配置数据库镜像.http://msdn.microsoft.com/zh-cn/library/ms189852.aspx数据库镜像概述实施步骤:本文档主要讲解如何用SQLServer管理台配置数据库镜像主服务器: tb-develop镜...</summary><published>2009-05-14T07:02:00Z</published><updated>2009-05-14T07:02:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/05/14/1456834.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/05/14/1456834.html"/></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/05/14/1456826.html</id><title type="text">使用stsadm.exe工具实现SharePoint网站备份还原</title><summary type="text">使用stsadm.exe工具实现SharePoint网站备份还原一、过程概要：首先在源站点机器上用stsadm.exe备份网站集,讲备份文件拷贝到目标服务器(也可直接在备份时配置备份路径为目标机器路径),然后执行还原操作:首先新建网站集，然后用SharePoint自带的stsadm.exe工具来实现站点的还原.还原完成后拷贝sp.listview控件所需dll并且修改web.Config配置文件。...</summary><published>2009-05-14T06:51:00Z</published><updated>2009-05-14T06:51:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/05/14/1456826.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/05/14/1456826.html"/></entry><entry><id>http://www.cnblogs.com/zwwon/archive/2009/04/29/1446156.html</id><title type="text">不能打开文件:mk:@MSITStore:路径[cannot open the file mk@MSITstore:路径]解决办法 转</title><summary type="text">转自:http://hi.baidu.com/vking/blog/item/5bbce4dd2d5b7aec76c638bc.html/cmtid/7897a9d33626523e970a16a9不能打开文件:mk:@MSITStore:路径[cannot open the file mk@MSITstore:路径]2007年12月11日 星期二 上午 11:50不能打开文件:mk:@MSITS...</summary><published>2009-04-29T05:32:00Z</published><updated>2009-04-29T05:32:00Z</updated><author><name>广思</name><uri>http://www.cnblogs.com/zwwon/</uri></author><link rel="alternate" href="http://www.cnblogs.com/zwwon/archive/2009/04/29/1446156.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/zwwon/archive/2009/04/29/1446156.html"/></entry></feed>
