RSS 2.0 Feed

Monday, January 28, 2008

今日偶然阅读了Understanding Single Sign-On in ASP.NET 2.0 这篇关于单点登录的文章,仔细阅读,发现还是有些不尽完整之处。

文中对于单点登录的介绍,忽略了一个重要问题——就是站点的域的问题。在深入讨论这个问题之前,先简单介绍一下网站域的概念,举个例子,假如我们有三个站点:
A: blog.joycode.com; B: beta.joycode.com; C: www.openlab.net.cn 。那么A站点的域是"blog.joycode.com",它的主域是"joycode.com";B站点的域是"beta.joycode.com",它的主域是"joycode.com";C站点的域是"www.openlab.net.cn" ,它的主域是"openlab.net.cn"。对于A和B来说,他们是不同的网站域,但是主域是相同的,都是"joycode.com",对于A和C来说,不管是域还是主域,都不相同。一般我们所说的单点登录,都是指A,B,C这三类站点可以在一点登录,实现所有的站点都不需要再次登录,甚至于不仅限于网站之间,也可能是从其他客户端到网站。一般比较大的系统都需要这样的单点登录系统,例如著名的微软的Passport,还有飞信的SSO。

回过头来看这篇单点登录文章,按照这种方案,仅能实现同一域下各虚拟目录的单点登录,离真正的单点登录还差得远,当然,文章的思路,对于同一域下的虚拟目录,或者同一主域的不同站点,还有有意义的。

前面说到了文章中的方案还只能实现同一域下的不同虚拟目录的单点登录,还不能实现同一主域的单点登录,那么怎么样才能在这个方案基础上实现同一主域的不同站点的单点登录呢?

文章的核心部分在于让每个站点的MachineKey保持一致,采用Form验证,这样可以保证每台服务器Cookie加密解密的结果是一致的。Form验证将登录后的授权凭证加密后保存在Cookie中,由于同一域下面的虚拟目录,Cookie是可以共享的,因此可以同一域内直接实现单点登录,而对于不同域,Cookie是不能直接共享的,所以对于不同域而同一主域的情况,我们还需要将Cookie的domain设为主域。那么还以前文的A、B站点为例,要实现单点,我们只要在web.config中,配置authentication \forms节点下domain值为主域,如下:
<authentication mode="Forms"> <forms loginUrl="login.aspx" name=".ASPXAUTH" domain="joycode.com"/> </authentication>
即可实现同一主域不同子域站点之间共享登录了。

而对于不同主域的站点,实现方案相对就复杂多了。

posted @ | Feedback (18) | Filed Under [ Web技术 ]

Tuesday, August 21, 2007

继CCS之后,重头打造了一套类似的系统——openlab,一套社区系统(此版本仅包含论坛程序)

源码在CodePlex上: http://www.codeplex.com/openlab

官方站点:http://www.ol.org.cn

发布了第一个Release,一年多了,所谓慢工出细活,希望能让大家满意!

 

关于Openlab架构方面的文章,会逐渐在博客中和大家分享,谢谢支持!

posted @ | Feedback (20) |

每个程序员,都会有自己的技术梦想,想借自己手中的一点技术,做一些有意义的事情,这也是我们努力钻研技术的一点原动力——看着我们的梦想在努力后变成现实,那种快乐是没有什么能代替的^_^

 

我的第一个技术梦想是想做一个自己的个人主页,正是由于这个梦想将我引进了技术世界,从此和软件开发结缘。后来又有各种各样的技术梦想,正是这样一个个的梦想,让我对技术开发产生了浓厚的兴趣和激情,为了实现这些梦想,让我刻苦的钻研相关技术。

 

当年脚本还不太熟的时候,刚开始用msn messenger,觉得界面好酷啊,想要是能用网页来做一套一样多好,于是就开始留意和学习脚本知识,查MSDN,论坛发帖问人,不久做出来了可以以假乱真的Msn Messenger界面,后来又做了好多模拟windows程序的页面,例如模拟Msn Explorer的、模拟Windows Explorer的界面、模拟Media Play的、模拟小人在地图中行走等脚本。正是由于此,打下了良好的脚本基础。

 

刚毕业的时候,特别怀念学校,那时候学校没有自己的BBS,只能到其他BBS的西工大版块去寻找一下精神寄托,就特别想有一个属于我们工大校友同学自己的BBS,于是有了今天的开放实验室,有了CnForums,有了CCS。CCS一段时间之后,由于不满意CS的性能,以及基于CS本地化的种种不便,并且很想将自己多年Web开发的经验有一个总结,于是创建了Openlab项目,经历了各种技术障碍,牺牲了若干休息时间,到今天终于略有小成

 

还有一些很有意思的梦想,例如我们项目组内部灌水成风,有专门的Chat邮件组用于灌水,有不少有意义的邮件,但是作为邮件不容易保存,一次重装系统很可能就丢了很多宝贵的邮件,所以当时JJ同学就提议能不能有一个程序可以把邮件都同步到论坛,当时还没有什么头绪,后来在Openlab开发期间,逐渐有了思路,并且基于Openlab框架完成了这一很有创意的梦想,将很多宝贵的历史邮件以论坛帖子形式保存了下来,甚至于邮件中的图片附件都可以保持原有格式。

 

邮件同步到论坛的成功,这又间接帮助我完成了另外一个梦想——刚毕业时公司网络是封禁的,除了邮件什么都用不成,就想能不能通过邮件来完成论坛的看帖发帖回帖,或者有时候看到有好玩的邮件想转到论坛,却没办法直接把邮件的内容发到论坛(里面很多本地图片)。在邮件同步论坛梦想实现后,解决了邮件格式到帖子格式转换的一大难题,要实现邮件发帖到论坛,最有效的方式就是自己写一个SmtpServer,于是开始尝试参照SMTP协议写简单的SmtpServer,经过多次的失败和努力,终于又实现了一个多年的梦想。

 

正是这样一个个技术的梦想,给我无限的激情,指引着我前进的方向。

 

你的技术梦想是什么?

posted @ | Feedback (39) | Filed Under [ 生活 ]

Thursday, June 07, 2007

临时放一下,各位见谅!


 

目前 Windows Mobile Team 招开发人员2名,需求如下:

1. 熟练掌握 Microsoft.NET/.NET Compact Framework

2. 至少两年的 Microsoft.NET 开发经验:.NET 应用程序,TCP/IP, 网络开发;

3. 或熟练掌握 C/C++开发;

4. 性格开朗,团结互助,很强的团队意识;

5. Windows CE/Mobile 开发经验优先;

 

Windows Mobile 开发简介:

Windows Mobile 开发基于 .NET Compact Framework,简称 .NET CF:

1.       .NET CF 开发有别于 .NET Framework开发,因:

l  .NET CF 1.0 .NET Framework 很小的子集;

l  .NET CF 1.0 目前存在很多 Bugs;

l  受限于 Windows Mobile 平台本身,OS 2003, OS 5.0, OS 6.0,平台要求相差很大;

2.       .NET CF 所提供的功能非常有限,更多时候,需要开发人员使用 P/Invoke 来实现,一些情况下需要用 C++封装 Win32 提供 .NET CF 的接口,

对开发人员技术能力和要求更高;

3.       Windows Mobile 开发的基本要求是低内存占用,低CPU占用,低耗电量,应用性能要高,开发人员要平衡上述各方面要求,因此对于编程技术,算法,数据结构,操作系统架构,技术能力是很大的挑战!

4.       Windows Mobile 将是下一波技术热点。

 

项目简介:某电信项目,拥有一个上百人的研发团队,并正在招聘Windows Mobile开发人员。 如果你渴望让上千万的用户享用你的创意,并有足够的信心与能力做出优秀的产品,欢迎您的参与!

 

联系方式:franklv@microsoft.com; v-xincli@microsoft.com

 

同时还有其他职位,例如飞信网站、产品设计、服务器端开发、客户端开发等职位。

posted @ | Feedback (39) |

Tuesday, April 10, 2007

不得不感慨:我随意写的小软件竟然能引起如此多盗版。也许我不该做Web,改行写共享软件说不定前景8错 :-)

五天前,我写了一篇博客:《改改版权就是自己的》,讲的CnBeta上的一款软件,将我的程序甚至连名字都没改仅仅改了一下版权就变成自己的软件了,在我的博客发布一天后,CnBeta就删除了原文。然而不到一周,今天晚上在CnBeta上发布的一款名为:“照片瘦身”的软件(原创软件:照片瘦身工具),同样出自我的那款照片缩略软件,所不同的是修改了部分界面样式和软件命名。

这不是我第一次经历这样的事情,我在上大学时写过不少asp的系统,最典型是有一款为学校网站写的影视下载程序,发布后,没多久就出来若干改了版权或者略加改动后的盗版程序,到最后,最可气可笑的是,反过来有人认为我自己的“原版”是盗版的,悲哀。后来还发生过多起源码被窃取再修改版权的事情,经常会看到一些OA系统或网站系统就是在我泄漏代码的基础上修改了一下版权和部分界面就堂而皇之卖钱的。

posted @ | Feedback (39) |

Thursday, April 05, 2007

前言

可能有很多朋友在使用CommunityServer(以下简称CS)的过程中,当数据越来越多后,速度会越来越慢,资源耗用越来越大,对于性能不好的服务器,简直像一场噩梦一样,我终于刚刚结束了这个噩梦,简单谈谈是什么原因导致了CS在性能上存在的种种问题。(我对于数据库方面不是很专业,所以如果本文中有什么谬误,敬请各位指出,不胜感谢!)

忘了自我介绍一下,我是宝玉,以前做过Asp.net Forums和CommunityServer的本地化工作,母校西工大的民间社区(http://www.openlab.net.cn)用的是CS系统。该有人骂我做广告了,其实我是防盗版,郭安定大哥那学的,哈哈!

性能问题分析

鸡肋式的多站点支持

其中一个性能影响就是它的多站点功能,也许这确实是个不错的注意:同一个数据库,不同域名就可以有完全独立的站点,但是对于绝大部分用户来说,这个真的有用么?首先姑且不讨论它是否真的那么有用,但是在性能上,他绝对会有一定影响的:系统初始化的时候,首先要加载所有的站点设置,这也是为什么CS第一次访问会那么慢的原因之一;然后大部分查询的时候,都要带上SettingId字段,并且在数据库中,对这个字段的索引并没有建的很理想,对于大量数据的查询来说,如果没有合理的建索引,有时候多一个查询条件对于性能会带来极大的影响。

内容数据的集中式存储

一般的系统,都尽可能的将大量的内容数据分开存储(例如飞信系统的用户存储,就是分库的^_^),对于数据库,更是有专门的分库方案,这都是为了增加性能,提高检索效率。而CS由于架构的原因,将论坛、博客、相册、留言板等内容管理相关的信息,全部保存在cs_Groups(分组)、cs_Section(分类)、cs_Threads(主题索引)、cs_Posts(内容数据),这种架构给代码编写上带来了极大的便利,但是在性能上,不折不扣是个性能杀手,这也是CS慢的最根本原因,举个例子,假如我的论坛有100W数据,博客有5万条数据、相册有10万条数据,如果我要检索最新博客帖子,那么我要去这120万数据里面检索符合条件的数据,并且要加上诸如SettingsId、ApplicationType等用来区分属于哪个站点,哪种数据类型之类的条件,数据一多,必然会是一场噩梦,让你的查询响应速度越来越慢,从几秒钟到几十秒钟到Sql超时。

过于依赖缓存

缓存是个很好的东西,可以大大的减少数据库的访问,是asp.net程序提高性能必不可少的。不知道各位在设计开发系统,用缓存用的很爽的时候,有没有想过,如果缓存失效了会怎么样?如果缓存太大了会怎么样?相信各位CS会有一个感觉,那就是CS刚启动的时候速度好慢,或者使用过程中突然变的很慢,那就是因为好多数据还没有初始化到缓存,例如站点设置、用户资料、Groups集合、Setions集合等等一系列信息,这一系列信息的加载加起来在服务器性能不够好的情况下是个漫长的过程,如果碰巧还要去查询最新论坛帖子、未回复的帖子之类,那么噩梦就开始了,这时候就要拼人品了,看你是不是应用程序池刚重启完的第一个人o(∩_∩)o 。CS在缓存的策略上,细粒度不够,一般都是一个集合一个集合的进行缓存(例如最新论坛帖子集合),这样导致缓存需要频繁更新,而且缓存内的数据一般比较大,内存占用涨的很快,内存涨的快又导致了应用程序池频繁重启,这样,CS在缓存方面的优势反而变成了一种缺陷,导致服务器的资源占用居高不下。

CCS的雪上加霜

前面说过,我做过CS的本地化开发,加了不少CS的本地化开发工作,但是由于当时数据库知识的匮乏,导致了一些在性能上雪上加霜的行为,例如精华帖子功能,其中标志是否为精华帖(精华等级)的ValuedLevel字段没有加上索引,在数据量大的情况下,检索会比较慢。由于我已经不在做CCS的开发,已经没有办法来修正这些性能问题了,只能对大家表示歉意。

后记

如何解决?

最简单就是等着升级了,相信CS以后的版本会越来越强劲的,这些问题肯定会逐步解决的。如果等不及的话,就只能自己动手了,使用Sql Profiler监测Sql的执行,找出影响性能的查询,然后针对性优化。

前面我说我结束CS性能的噩梦,肯定有朋友会问我怎么结束的了,在此,就先埋一个伏笔了,在05年的时候,我就开始如何构思开发一套高性能的类似CS的系统,06年初开始设计,然后利用业余时间进行了具体的开发,到今天已经有了小成,在性能上有了质的飞跃,针对这套系统的设计和性能优化的心得,我会逐渐以博客的形式来和大家一起分享交流。

posted @ | Feedback (31) |

本要睡了,刚看到博客园上dudu想要找套论坛系统,要整合到博客园的系统,偶正好这方面经验比较丰富,而且想和dudu合作,将偶开发的论坛系统和博客园的博客系统整合,简单写一下整合方案:

整合最核心的就是用户的整合,整合用户,一种方式就是直接将某套系统完全采用其中一套用户的帐号系统,这种方式一般改动量比较大;一种方式就是系统之间的用户保持同步,保证数据保持一致,包括加密方式,但是如果两者加密方式差别大,可能会比较麻烦,我这里重要要说的是第三种方式。

首先,要以其中一套系统的用户系统为主,在这里我们完全以博客园的用户系统为中心,注册、验证、修改密码、修改资料(论坛资料除外)都走博客园的系统。那么博客的用户怎么同步到论坛呢?在登录的时候,前面说了,登录都走博客园的系统,那么博客系统登录后,就可以拿到登录凭证以及用户资料(两个系统都是基于asp.net 2.0和并且是部署在同一个域下,这样Form验证的授权可以直接共享,否则就得提供相应的接口了)。

然后返回到论坛系统时,论坛系统会首先检测有没有当前登录的这个用户的资料,如果没有,那么创建之,并使用博客用户的数据初始化论坛用户的数据,如果已经有了用户,那么只要更新一些用户信息就可以了。

这样用户整合就算是完了,整个系统也算是整合完了,就这么简单!

posted @ | Feedback (26) |

Tuesday, April 03, 2007

不知道朋友们是否记得我去年在博客堂曾发布过一个小软件——批量缩略图片的《批量生成缩略图小工具》,专门为小宝玉写的,当时把源码也带上了,今天在CnBeta上看到《网友制作:Thumbnail Images 图片批量缩略图》,不就是我当初写的那个小软件么,只不过版权变了:)

 

好久没被盗版了,感觉真好,o(∩_∩)o...哈哈

posted @ | Feedback (26) | Filed Under [ 生活 ]

Tuesday, February 06, 2007

昨日的博客堂不谈技术年会举办的相当成功:女性比率特别多;礼物特别多;迟到的不少,但是提前走的几乎没有;都很开心;认识了不少新朋友。无论是物质上还是精神上,都让我感觉收获颇丰。参加聚会的朋友都带上了丰厚的礼物,有CD、游戏光盘、帽子、T恤、手表、布娃娃、百合网的套装……琳琅满目,一个桌子都摆不下。

 

在由博客堂的大当家开心同学做完开场白后,博客堂的不谈技术年会正式拉开序幕。

  

围绕着不谈技术的主题,大家首先轮流做了一番自我介绍,回顾了2006,展望2007。(博客堂成员的照片)

 

在其间,穿插了关心同学带来的一个小游戏:“每位同学都要提交一个0-100之间的数字(包括小数),最后取所有数字的平均数,然后再乘以黄金分割(0.618),看最后谁的数字和这个数字最接近”。这个游戏蛮有意思,有人压根想都没想就把数字写上了,也有人想了特别复杂,认为最终结果趋于0,不过毕竟聪明人还是少数,所以最终结果还是没有那么小。

 

郭安定老师为我们做了一次精彩的讲课,围绕博客的主题,教我们如何利用博客宣传自己,如何有效防止自己的博客被盗版。这里偷偷透露一招,要想博客不容易被盗版,在文章内到处写满自己的名字吧(应该已经有不少人用过了)。

 

根据数字的结果,大家一个个上台轮流拿奖品,拿奖品之前,写Tag。偶还不错,分数比较靠前,于是拿起了百合套装,觉得还是这玩艺送给老婆最合适:)

 

有人带来了香槟,大家一起举杯祝贺!

 

最后大家自由组合,合影留念!

  

 

BTW:文章早就写好了,因为等照片今天才发:)

posted @ | Feedback (113) |

Tuesday, January 23, 2007

如果你的Asp.Net程序执行时碰到这种错误:“验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate”那么说明你没有让你的应用程序使用统一的machineKey,那么machineKey的作用是什么呢?按照MSDN的标准说法:“对密钥进行配置,以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证。”也就是说Asp.Net的很多加密,都是依赖于machineKey里面的值,例如Forms 身份验证 Cookie、ViewState的加密。默认情况下,Asp.Net的配置是自己动态生成,如果单台服务器当然没问题,但是如果多台服务器负载均衡,machineKey还采用动态生成的方式,每台服务器上的machinekey值不一致,就导致加密出来的结果也不一致,不能共享验证和ViewState,所以对于多台服务器负载均衡的情况,一定要在每台站点配置相同的machineKey。

machineKey生成的算法:

validationKey = CreateKey(20);

decryptionKey = CreateKey(24);

     protected string CreateKey(int len)

     {

            byte[] bytes = new byte[len];

            new RNGCryptoServiceProvider().GetBytes(bytes);

              StringBuilder sb = new StringBuilder();

              for(int i = 0; i < bytes.Length; i++)

              {   

                   sb.Append(string.Format("{0:X2}",bytes[i]));

              }

              return sb.ToString();

     }

附参考的matchineKey配置:

<?xml version="1.0"?>

<configuration>

  <system.web>

    <machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>

     </system.web>

</configuration>

posted @ | Feedback (11) | Filed Under [ Web技术 ]

Thursday, November 16, 2006

如果有自己的服务器,如果想查看当前IIS连接情况:例如有多少个请求,每个请求的动作,请求的Url,请求的IP等信息,使用微软的IIS Diagnostics Toolkit无疑是非常好的选择,利用它的IIS Request Viewer,查看当前连接以及连接状态,一目了然,非常方便好用。

不过要特别注意,在第一次使用IIS Request Viewer功能时,极有可能会弹出来一个错误窗口

---------------------------
Warning
---------------------------
OpenTraceLogFile() failed (Win32 error:-2147024735 - 指定的路径无效。)
---------------------------
确定 取消
---------------------------

被这个问题郁闷了很久,今天终于找到解决方法了:

在“我的电脑”属性里面的“环境变量”设置里面,设置Temp目录为一个较短的目录,例如c:\temp,就不会有这个错误。

IIS Diagnostics Toolkit for 32-bit systems

DownloadDownload the iisdiag.msi package now.

posted @ | Feedback (22) |

Friday, October 13, 2006

自从有了数码相机,自从有了小宝玉,那肯定是少不了要照上一堆的照片,照好了还免不了要传给父母、朋友看看,或者传到网上相册中。一般一张照片一两兆,直接传慢死了,而且也没那么高的清晰度要求,没发现趁手的工具,于是自己就用.net写了一个简单的批量生成缩略图的工具,导完照片后,用工具选择好源目录和保存缩略图的目标目录,一点按钮就给全批量缩略了,还算比较简单实用。

基本原理就是遍历目录下所有文件,如果是图片文件,就利用gdi+生成缩略图,再保存。

下载地址: http://www.webuc.net/MyProject/ThumbnailImages/ThumbnailImages.rar

源码:http://www.webuc.net/MyProject/ThumbnailImages/ThumbnailImages_src.rar

posted @ | Feedback (16) |

Tuesday, September 19, 2006

今天看到网易的博客(http://blog.163.com)发布了,网易的技术确实不错,用起来感觉体验很好,就是用起来很有点似曾相识,主要功能是Spaces的翻版,相册很多借鉴了Flickr。

posted @ | Feedback (10) |

模版页中难免要引用CSS、脚本、图片等,这些文件的路径如果简单的使用相对路径,那么如果引用模版的目录一发生变化,这些路径就会出错;如果使用绝对路径,又不够灵活,如果应用程序目录发生变化,可能会导致要大量修改。asp.net支持一种相对于应用程序的路径,以波浪线开头的,形如"~/",使用它即可解决,例如:
<link rel="stylesheet" media="screen" type="text/css" href="<%=ResolveClientUrl("~/css/global.css") %>" />

当然如果你觉得每个路径都要写成动态的不爽,而又正好有页面基类的话,倒是可以换一种方式:

所有的路径直接书写为相对于应用程序目录的路径,形如:
<link rel="stylesheet" media="screen" type="text/css" href="~/css/global.css" />
当然默认HTML是不支持的这样的路径方式的,这时候就要借助PageBase了,代码如下(好像是从DNN的代码里面抠出来的):

 

    public abstract class PageBase : Page
    {
        protected override void Render(HtmlTextWriter writer)
        {
            StringWriter stringWriter = new StringWriter();
            HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
            base.Render(htmlWriter);
            string html = stringWriter.ToString();
            #region 转换相对路径
            MatchCollection collection = Regex.Matches(html, "<(a|link|img|script|input|form).[^>]*(href|src|action)=(\\\"|'|)(.[^\\\"']*)(\\\"|'|)[^>]*>", RegexOptions.IgnoreCase);
            foreach (Match match in collection)
            {
                if (match.Groups[match.Groups.Count - 2].Value.IndexOf("~") != -1)
                {
                    string url = this.Page.ResolveUrl(match.Groups[match.Groups.Count - 2].Value);
                    html = html.Replace(match.Groups[match.Groups.Count - 2].Value, url);
                }
            }
            #endregion
            writer.Write(html);
        }
    }

posted @ | Feedback (21) | Filed Under [ Web技术 ]

这是我和两位师弟(NickLedsonSheva)一起翻译的一本Asp.Net书 ,感谢搏客堂的关心为此书作了序《序言 - 最优化ASP.NET: 面向对象开发》,即将公开发售。此书尤其适合那些从asp转到asp.net的程序员,或者还没有面向对象概念的asp.net程序员。

附:

宣传页:http://www.huachu.com.cn/2006/aspnet.htm 

链接地址:
http://www.china-pub.com/computers/common/info.asp?id=31564
http://www.dearbook.com/book/110871

posted @ | Feedback (13) |