在以前的一个积分兑换系统中,出现一个错误就是用户为0和负分时任然可以兑换礼品。检查兑换提交程序,一直没有发现问题。今天又发生这个问题,才发现是浏览器窗口没有关闭,多个用户登录,导致购物篮Cookies记录的信息错误。我们测试程序是在理想状态下,所以总是发现不了错误,用户在意想不到的情况下操作,就出现了问题。这个问题提醒我们1、测试方法和流程还有待于完善。2使用类似Cookies这种客户端可共享的存储方式一定要逻辑严密,从生成到销毁,避免混乱发生。

posted @ 2010-12-09 14:23 Flymouse 阅读(66) 评论(0) 编辑

今天在SQl 2005数据库上运行查询语句,出现错误提示:“数据库错误:在执行批处理时出现错误。错误消息为: 目录名无效”,查看估计执行计划,看到提示“c:\Documents and Settings\XXX\Local Settings\Temp\6\ag9vjs3.tmp文件不能访问”,出现这种情况首先看一下,磁盘是否已满,如果磁盘没有满,就是写目录权限有问题,看看是否补丁都打上了,看看是否有杀毒软件或者防护软件禁止写C盘等等。如果是在无法处理,可以手工创建一个提示中需要的目录,比如我的提示中是\Temp\6\ag9vjs3.tmp文件不能访问,我就在Temp下创建了一个名为“6”的文件夹,这样查询就可以执行了。

posted @ 2010-10-19 09:41 Flymouse 阅读(470) 评论(0) 编辑

前几天听到Dudu介绍NorthScale Memcached Server, 感觉很不错,从配置到监控都很方便,于是准备尝试一下。当时在我的Win7 64x安装比较顺利,没有碰到问题,但是安装在一台Win2008 32x的服务器上是总是无法启动,日志提示:

Erlang machine stopped instantly (distribution name conflict?). The service is not restarted, ignoring OnFail option.

从提示表面是服务获知准确的错误信息,经过多次测试发现,是在同一块网卡上绑定多个IP时就会发生这个错误,向NorthScale的开发人员反应问题并希望得到解决,他们给了个重新设置服务IP的方法,如下:

1. from "INSTALLDIR\Memcached Server\bin"
2. run "service_stop.bat"
3. run "service_unregister.bat"
4. run "service_register.bat ns_1@<PHYSICAL IP>"
5. run "service_start.bat"

但是我测试了几次,对多IP没有效果,仍然无法启动服务。

如果服务安装在单IP网卡,以前是正常启动的,在IP发生改变时可以用这个方法修改服务绑定的IP。

一直在等待他们的NorthScale MemBase Server 这个产品的和NorthScale Memcahced Server区别是,MemBase Server的数据会dump到地盘,可以做分布式数据库使用。

之前看姜敏的NorthScale Memcached Server尝试总结中熊哥提到无法使用stats cachedump命令,我看了一下,可能是NorthScale使用Memcached的二进制协议通讯,二进制协议比文本协议高效,但是不支持stats cachedump命令。

前天看到NorthScale MateBase Server 1.6 Beta3发布了,拿来安装测试,发现当初说在此版本要解决的网卡多IP问题还没有解决,期待正式版。

 

现在需要在生产环境中使用NorthScale,但是他不支持stats cachedump,无法获取缓存中的缓存项的key,只好想了一个折中的办法,通过一个缓存来保存目前缓存列表,在每次set时,更新缓存列表。

 

以下是几段代码:

    public class MemCachedCache:ICacheProvider
    {
        private static NorthScaleClient client;

        static MemCachedCache()
        {
            try
            {
                client = new NorthScaleClient();
            }
            catch (Exception ex)
            {
                log4net.LogManager.GetLogger("northscale").Info("EnyimMemcachedProvider", ex);
            }            
        }

        #region Implementation of ICacheProvider

        /// <summary>
        /// 获得缓存内容
        /// </summary>
        /// <param name="cacheKey">缓存键</param>
        /// <returns>缓存内容</returns>
        public string GetCache(string cacheKey)
        {
            if (client == null)
            {
                return null;
            }
            else
            {
                object v = client.Get(cacheKey);
                return v == null ? null:v.ToString();
            }
        }

        /// <summary>
        /// 设置缓存内容
        /// </summary>
        /// <param name="cacheKey">缓存键</param>
        /// <param name="cacheContent">缓存内容</param>
        /// <param name="duration">缓存有效时间,分钟</param>
        public void SetCache(string cacheKey, string cacheContent, int duration)
        {
            if (client != null)
            {
                client.Store(StoreMode.Set, cacheKey, cacheContent, new TimeSpan(0, 0, duration*60));
                UpdateCacheItems(cacheKey);
            }
        }

        /// <summary>
        /// 清除缓存内容
        /// </summary>
        /// <param name="cacheKey">缓存键</param>
        public void ClearCache(string cacheKey)
        {
            if (client != null)
            {
                client.Remove(cacheKey);
            }
        }

        /// <summary>
        /// 清除部分缓存
        /// </summary>
	/// <param name="pattern">部分清除模板</param>
        public void ClearCacheByPattern(string pattern)
        {
            if(client!=null)
            {
                object c = client.Get("globel_cacheitems");
                if (c!=null)
                {
                    List<string> cacheitems = (List<string>) c;
                    foreach (string cacheitem in cacheitems)
                    {
                        if (cacheitem.StartsWith(pattern))
                        {
                            client.Remove(cacheitem);
                        }
                    }
                }
            }
        }

        /// <summary>
        /// 清除所有缓存
        /// </summary>
        public void ClearAllCache()
        {
            client.FlushAll();
        }

        /// <summary>
        /// 更新缓存项列边
        /// </summary>
        /// <param name="key">要填加的key</param>
        public void UpdateCacheItems(string key)
        {
            List<string> cacheitems;
            CasResult<object> c = client.GetWithCas("globel_cacheitems");
            //判断列表项缓存是否存在
            if(c.Cas>0)
            {
                cacheitems = (List<string>) c.Result;
                //判断列表中有没有这个key
                if (!cacheitems.Contains(key))
                {
                    cacheitems.Add(key);
                    //判断是否保存成功,这里递归操作并使用Cas,是为了避免并发状态下造成缓存列表竞争,保证最终更新成功
                    if (!client.Cas(StoreMode.Set, "globel_cacheitems", cacheitems, c.Cas).Result)
                    {
                        UpdateCacheItems(key);
                    }
                }
            }
            else
            {
                cacheitems =new List<string>();
                cacheitems.Add(key);
                client.Store(StoreMode.Set, "globel_cacheitems", cacheitems);
            }
        }
        #endregion
    }
posted @ 2010-09-11 23:44 Flymouse 阅读(701) 评论(2) 编辑

web.config中配置目录,通过模拟用户访问该目录:

 

<location path="uploads">
<system.web>
<identity impersonate="true" password="*******" userName="aaaaa" />
</system.web>
</location>

这个用户是windows用户,有权访问虚拟目录所映射的网络目录

 

posted @ 2010-07-15 01:05 Flymouse 阅读(32) 评论(0) 编辑

在使用了URL重写的页面,我们为了保证用户进行PostBack后页面的URL仍然是,我们原先展现给用户的链接,比如是list_1.html而不是list.aspx?page=1

我们需要使用app_browsers目录,存放浏览器定义文件,相关说明可以参考msdn:http://msdn2.microsoft.com/zh-cn/library/ms228122(vs.80).aspx

 

<!--
可在 <windir>\Microsoft.NET\Framework\<ver>\CONFIG\Browsers 中找到现有的浏览器定义
-->
<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.HtmlControls.HtmlForm"
               adapterType="FormRewriterControlAdapter" />
    </controlAdapters>
  </browser>
</browsers>

 

 

代码如下:
public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            if (HttpContext.Current.Request.RawUrl.Contains(".html"))
            {
                base.Render(new RewriteFormHtmlTextWriter(writer));
            }
            else
            {
                base.Render(writer);
            }
        }
    }
    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
        public RewriteFormHtmlTextWriter(Html32TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }

        public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer;
        }

        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name == "action")
            {
                if (HttpContext.Current.Items["ActionAlreadyWritten"] == null)
                {
                    value = HttpContext.Current.Request.RawUrl;
                    HttpContext.Current.Items["ActionAlreadyWritten"] = true;
                }
            }
            base.WriteAttribute(name, value, fEncode);
        }
    }
以上代码一直运行了很长时间,但是后来在使用asp.net Ajax是发现URL重写后的页面会出现错误,重新修改代码,排除Asp.net Ajax请求进行处理,代码如下:
public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            if (HttpContext.Current.Request.RawUrl.Contains(".html"))
            {
                //取得asp.net Ajax请求标志
                var AsyncPost=HttpContext.Current.Request.Form["__ASYNCPOST"];
                if (AsyncPost=="true") //判断是否asp.net Ajax请求
                {
                    base.Render(writer);
                }
                else
                {
                    base.Render(new RewriteFormHtmlTextWriter(writer));
                }
            }
            else
            {
                base.Render(writer);
            }
        }
    }
    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
        public RewriteFormHtmlTextWriter(Html32TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }

        public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer;
        }

        public override void WriteAttribute(string name, string value, bool fEncode)
        {
            if (name == "action")
            {
                if (HttpContext.Current.Items["ActionAlreadyWritten"] == null)
                {
                    value = HttpContext.Current.Request.RawUrl;
                    HttpContext.Current.Items["ActionAlreadyWritten"] = true;
                }
            }
            base.WriteAttribute(name, value, fEncode);
        }
    }
后又经过调试发现是RewriteFormHtmlTextWriter的构造器有问题,没有包含htmlTextWriter类型的构造器,而使用了TextWriter类型构造器,导致页面结构错误出现null报错。再次调整代码如下:
public class FormRewriterControlAdapter : System.Web.UI.Adapters.ControlAdapter
    {
        protected override void Render(HtmlTextWriter writer)
        {
            if (HttpContext.Current.Request.RawUrl.Contains(".html"))
            {
                //使用过滤掉asp.net Ajax请求的方式避免错误
                //而后发现是RewriteFormHtmlTextWriter的构造器的问题,遂放弃方法
                //var AsyncPost=HttpContext.Current.Request.Form["__ASYNCPOST"];
                //if (AsyncPost=="true")
                //{
                //    base.Render(writer);
                //}
                //else
                //{
                //    base.Render(new RewriteFormHtmlTextWriter(writer));
                //}
                base.Render(new RewriteFormHtmlTextWriter(writer));
            }
            else
            {
                base.Render(writer);
            }
        }


    }
    public class RewriteFormHtmlTextWriter : HtmlTextWriter
    {
        //使用html 4.0方式的渲染器
        public RewriteFormHtmlTextWriter(HtmlTextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }
        //使用html 3.2方式的渲染器,兼容老浏览器
        public RewriteFormHtmlTextWriter(Html32TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer.InnerWriter;
        }
        //其他方式浏览器,有可能引起null错误
        public RewriteFormHtmlTextWriter(System.IO.TextWriter writer)
            : base(writer)
        {
            this.InnerWriter = writer;
        }

        public override void WriteAttribute(string name, string value, bool fEncode)
        {

            if (name == "action")
            {
                if (HttpContext.Current.Items["ActionAlreadyWritten"] == null)
                {
                    value = HttpContext.Current.Request.RawUrl;
                    HttpContext.Current.Items["ActionAlreadyWritten"] = true;
                }
            }

            base.WriteAttribute(name, value, fEncode);
        }

    }
关于HtmlTextWriter和Html32TextWriter可以看一下这篇文章 http://www.cnblogs.com/Vegaslee/archive/2007/12/04/982723.html
posted @ 2010-06-20 14:53 Flymouse 阅读(94) 评论(0) 编辑
摘要: Asp.net 中的viewState默认出现在Form内的第一个元素,如果viewState很大的话会影响搜索引擎搜索页面,我们可以通过重写render来调整其位置到form最后,具体代码如下:阅读全文
posted @ 2010-06-03 15:29 Flymouse 阅读(40) 评论(0) 编辑
摘要: 同时需要修改配置文件machine.config<processModel enable="true" timeout="Infinite" idleTimeout="Infinite" shutdownTimeout="0:00:05" requestLimit="Infinite" requestQueueLimit="5000" restartQueueLimit="10...阅读全文
posted @ 2010-05-08 23:01 Flymouse 阅读(128) 评论(0) 编辑
摘要: 最近有业务需求,在使用水晶报表时导出格式要求限制为PDF,但是水晶报表的reportviewer没有提供这样的选项,没有办法只好使用hack的水晶报表的到处对话框的方式来实现。具体实现为找到 “\aspnet_client\system_web\2_0_50727\CrystalReportWebFormViewer4\html\crystalexportdialog.htm&rdqu...阅读全文
posted @ 2010-04-08 19:48 Flymouse 阅读(90) 评论(0) 编辑
摘要: 今天在做Excel导出时发生的两个异常:“HRESULT:0x800A03EC”引发这个异常的原因很多,我遇到的问题是发现在表格区域命名错误,导致Microsoft.Office.Interop.Excel.Range NameRange = oWorkSheet.get_Range(cellname, Type.Missing);时无法找到这个名称,发生了错误。修改号对应...阅读全文
posted @ 2009-10-12 14:49 Flymouse 阅读(86) 评论(0) 编辑
摘要: 新装了win7 x64在调试以前在32位win上开发的Web应用程序时,好多网站多无法运行,再查了很多资料后发现是IIS没有支持32位程序的缘故。用以下方式处理后,可以运行:IIS7支持32位应用程序cscript %SystemDrive%\inetpub\AdminScripts\adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin64 1把全部...阅读全文
posted @ 2009-08-15 11:02 Flymouse 阅读(250) 评论(0) 编辑