终于完成了那个改造的博文了。感觉一身轻松啦,整个寒假都没过好!
我也希望,那些文章能为我加分。顺便这里做一个小小的“简历”,多描述一下自己。特别希望得到更多实战的机会,跳出校园的温床,到职场中磨练自己。
我在北京
恩,写这个并不是觉得自己很了不起需要用人单位来找我。
如果我和大家一起去投简历,然后去等。那您的公司用简单的简历过滤直接就可以把我屏蔽掉。所以我就想出了这个馊主意,把自己的简历变得不是那么正规,反而通过一些其他方面来去给自己争取机会。下面的很多东西,都是没法写在正规简历中的。
至于和我联系,恩。在这公布自己的手机号码不是很安全。所以,如果您希望一个肯实干,又不想花大把的时间去筛选简历,那就找我试试吧,反正还在校,我的要求也不高。这样对两方面都有效率。
这就而对没有什么高傲的成分在里面,希望大家明见。
同时感谢Aaron Wu 先生的指点!
A.平台学习经历
从08年年初开始学习.NET平台。对微软各种.NET平台的开发工具都有了解和使用。
对C#语言和VS开发工具有很好的掌握。
同时熟悉,SQLServer数据库和MySQL数据库。
对JavaScript正在恶补中(早些,把JavaScript当成了Java的延支语种,为保持平台统一性,耽搁了对JavaScript的学习)
对WPF、PowerShell也有一定的了解
重点研习了《C#高级编程》。
在博客园和CSDN的论坛混迹多时(在学习初期问了很多idiot的问题,现在反而潜水居多)
MSDN WebCast的关于ASP.NET的讲座看了很多。目前正在跟徐长龙老师的VS2008的教程,以及赵老师的MVC。
对Live 平台的课程理解最好(自认为)
B.实践经历
首先是学习进程中的练习等等,学习道路中经历过的一些练习像水晶报表,等等我觉得都不用在这里提了!重点提一下两个
1.08年暑假,和一位四川的朋友,共同完成了一个票务网站的开发。此时对多层架构的开发有了非常多的了解,对一个网站的建设和软件公司的业务流程都学习了很多。我主要完成了大部分的文稿、还有数据访问层。
使用的技术是ASP.NET2.0 + SQL Server 2000。
其实这是一个失败的项目,因为我们的开发完全是作坊式的,而对方的需求也是很山寨的。所以如果程序化地说明很困难。不过正是因为失败让我有了比做好以后更多的经验。至于这次经历的很多东西,我还想抽点时间再进行总结。
不过我还是给自己留下了不少经验!认识到了交流的重要性,以及对计划的重新理解。而且,经历过暑假那次,我更加认识到,作为项目开一定需要一个正规的团队通力协作。作坊是行不通的。
2.09年年初,成功用最完美的方式将微软的Live ID API集成到了康盛创想的Discuz!NT论坛。此次改造,让自己对WebService、云计算平台开发、以及Discuz!NT优秀的架构都有很更加深的认识,对自己技术水平提高有了长足的帮助。
其实指的前面的系列博文了!一些总结前面都有写到,这里不再赘述了!
有位朋友说,程序员就和网友中的玩家一样。最重要的就是项目的积累(经验值),现在我的积累还是太少了,如果要承担任务更加艰巨的开发可能还不能驾轻就熟。但是无论,现在能否找到工作的机会,这样的学习永远会持续下去的。
C.其他技能水平
1.英语六级今年惜败401分。个人认为英语还行。在做那个项目的时候,因为国内用Live ID API的人太少了,不得已和一个荷兰的MVP联系上了,和他的交流让我学了不少东西。
2.本人的写作能力也很强,其实不想写出来的。因为我怕我到了公司以后,不让我写程序,把所有的文档都给我了。
D.自我评价
我觉得太官腔的话不要放在这里了。关于我自己,我觉得独立能力很强,是我的优势。因为从开始接触计算机到现在,所有的东西都是我自己自学的,从小时候小霸王上的Basic,然后到谭浩强的《C语言程序设计》,然后到Live ID API。
但,同时,我也特别渴望能够融入一个团队。其实上次把Live ID API是我刚开始想在我自己计划的一个网站中做的,结果没想到用了那么长时间。如果之前能有一个朋友能够和我在一起做这些,速度肯定会快很多。
另外,在现在的大学校园里面。大家可能都知道的,一种很浮躁的风气,有的人只完成老师的任务,有的人成天游戏。我们宿舍就是这样的,真正静下心来学习的就我一个人,这里不是自夸。说我不受影响是不可能的,但是,每天晚上回到宿舍周围全是魔兽世界的画面,这让我非常渴望早一点摆脱这个环境。
而且经过两次的锻炼,我觉得我完全可以胜任一个标准的.NET程序员的工作。人是发展的,我也相信不断进步的我一定能为您的公司带来更多的价值。
E.我的优势
恩,首先是年轻吧!还要几个月才过20岁生日。虽然现在还在学校,不过做全职的工作对我来说根本没什么问题。
另外,在学习的过程中,我也看了很多的文章,关于在工作中的、业界的。在真正开始程序员的学习之前,我对日本的游戏产业有非常深的了解,我在新浪的博客,有一半的点击率来自对电视游戏的文章。这也是我的优势,如果是游戏公司,我能非常好的融入进去。
此外,我可能还有一些程序员不该有的过高的想象力。我愿意接受一些有挑战性的工作。
在去年的SD大会上,还有幸和《走出软件作坊》还有《疯狂的程序员》的作者阿朱,还有绝影有幸见面。特别是阿朱先生,还跟他讨教了不少东西。跟前辈的交流中,更让我了解到,进入岗位时,最首要的就是要做好自己的本质工作。《致加西亚的信》一直作为我处理各种问题的参考。
作为新人,对您我没有特别大的要求。就是一点,恩,payoff at time!
F.最后
可能您也许还希望得到我的联系方式,还有其他的信息。
在公共场合,为了保护隐私。我希望您能给我发邮件,我会把我的联系电话和地址,发给您。如果您还需要我的其他的信息,在邮件中提到就可以了。
关于我的教育背景,我也希望您不要过分关注。因为那些不会为我加分,反而可能会起到反作用。选择这个学校,就是因为他距离北京近,能让我接触最新的业界动态,能有更多的机会。
当然,如果您执意希望了解,我也会在邮件中提供给您。
G.又及
今年寒假的时候,我意外接到了一位姓于的小姐(是yu,但是不知道是那个yu)的电话。她问我是否愿意去他们公司实习。我当时答应了,但是回到学校之后有很多乱七八糟的事情,之前的博文还没有完成。
2月23号星期一的时候,还接到一个电话好像是13****03143。当时在上课,所以就没说完。但是后来怎么打都打不同了。如果您是于小姐那个公司的人,抱歉了,如果您还需要我,也请您联系一下我!
我的邮件地址:pcudb0189@sina.com
如果您还想了解更多的我,也可以去我新浪的博客 http://blog.sina.com.cn/eeeeeeee
我技术的文章都在博客园,以后关于业界的文章会逐步转移到CSDN
@博文仅供学习研究,所提供的代码希望大家慎用。请大家保护康盛创想公司以及Discuz!NT的知识产权,遵守相关协议。
这次改造中用到的Live ID 为 cainiao2010@hotmail.com 密码为 123456
大家可以进去看看一看我已经申请好的Live ID API
我这次也没有使用网上的空间,而是使用了花生壳的免费域名
如果你想实验一下,那么可以 直接下载花生壳 花生壳的 用户名 xiaocainiao2010 密码 aaa123456 它回自己把你本地的网站与这个花生壳的免费域名做绑定。
如果解决了上一篇我遗留的问题。我个人认为,这个完全可以拿来商用了,不过为了不惹上官司,大家还是慎用为妙。 这次改造让我了解了很多东西,这里我也总结一下。
1.收获颇丰
这次的改造让我收获了很多东西。因为前期太投入了,所以在考场上败得一塌糊涂。但是我觉得这次的成长比以往都要快。
首先是Live ID ,云计算平台的东西,着实新鲜了一把。而且通过对他的访问,让我了解了更多WebService的内容,了解了他的运行机制。如果今后云计算平台的开发主流了,我也算是有经验了。
其次就是对Discuz!NT的学习了。
网上很多朋友对Discuz!NT颇有微词。但是我还是觉得他是跟成功的产品,特别是他的架构,可以兼顾速度、平衡还有丰富多彩的功能。我觉得这样就很了不起了。之前,学习的时候做的练习都太初步了。而通过Discuz!NT我有了更加具体的思考。我就在想,如果要我自己写个论坛,我该怎么写。Discuz!NT是给很好的教材。当然如果是我写,我一定会让他有更多.NET特色。
然后,就是对别人代码的改造。虽然我改的Discuz!NT是基本上没有问题的代码。但是他不符合你的需求,那么他其实就是有问题的,假设他就是bug,就是别人留下的bug,你要怎么来处理呢?而且这是问题,并不是赋值粘贴几行代码就可以了。
不然最后,还是报错了。
报错也不可怕,其实根据错误的行,然后找到根源,然后处理到错误就行了。这让我对以后的工作,产生了很多新的认识,原来,我应该这么做。
特别是在PageBase问题上。我原想的想法是直接修改父类。但是这样太天真了,别的子类怎么办呢?
原来看书时枯燥的知识,现在感觉都成了我的正面临的问题。晚上我翻回去去看《C#高级编程》发现原来生疏的东西是那么熟悉。
用最少的代码做最多的事情。我不敢保证,我的代码绝对有问题。可能在安全上,我还存在很多不足。
刚开始的时候,我多次想放弃使用Discuz!NT,他真的太复杂了。但就像刚才说到的一样,你认为的复杂其实是自己的不了解。如果静下心来认真阅读代码,就能发西安突破口。
之前,我想直接在数据库中添加Live ID字段,现在想象真的是太愚蠢了,我们不需要密码,那直接把user.id写进密码就行了吗!
这样省了不少事情。
2.我的敏捷开发
恩这个部分,来源于Info论坛提供的迷你书《硝烟中的Scrum和XP》,当时给我很大震撼,因为这和之强想象的那种流程式的开发完全不同。也让我有了很多新的认识。当然,就凭我现在的三脚猫的功夫,还远不足以胜任“敏捷”,但我还是要朝这个方向发展。所以,从自己专注的开发开始。
其实,我也没有特别去专注于敏捷这个概念的问题上。因为一开始,我只是在想,我要把Live ID 集成进来。然后该怎么办呢?网站好说,如果是个论坛呢,我要做的不仅集成,还有登陆,然后保持原来的功能。
然后就去找论坛。
找好了论坛了以后,从那里下手呢,如果你在Google“把Live ID 集成到论坛”能得到什么呢?
然后先找Live ID 的资料,然后找Discuz!NT的资料。
说实话,我一开始很迷茫。这该怎么做啊?但是我就在强制自己,每天都必须找点东西,发现问题,解决问题。
然后有一些成果后,再大体预测一下,安排我下来的步骤。我不可能一天完成所有的东西,然后就这样慢慢来,每天任务目标。
每天都在OneNote上写下我的一些想法和注意的地方,用Outlook来规划明天。
虽然最终的代码量很小,但是留下了很多其他的东西。
反过来看看,感觉自己的开发真的有点敏捷的味道。我也相信,如果将来我能加入到一个团队中去,这样的方法也会是非常有效的。
3.我是菜鸟不丢人
其实我刚开始用的标题是,谁说菜鸟写不出好文,但还是觉得不要那么张狂的好。
不过,我就是个菜鸟,而且接触.NET一年多,能达到什么个水平呢。说实话,也许你有很好的编程语感,但是在IT业,真正的牛人都是靠不断的技术积累成长起来的。特别是看过绝影的《疯狂的程序员》之后,更是有这样的感觉。
作为菜鸟的我们很羡慕那些高手,总觉他们天生就是高手似的。对自己总是自卑。
有的时候,菜鸟们问问题 ,经常有得不到合适的解答的时候。以前在CSDN发帖,就是这样,其实如果简单回答一下就可以解决所有的问题。但是我得到的回复却不是这样的。暑假的时候,跟一个朋友学技术,碰到不懂的问题,我得到的最先就是,“你怎么这样写”。我就心里犯嘀咕了,难道你就没有不会的时候吗?很多菜鸟都怕了,这很影响自己的进步的。
还有这次关于Discuz!NT安装的问题,我真的希望知道手动部署Discuz!NT应该怎么做,但愿有人告诉我了。
但是,既便如此我们小菜鸟们不应该自卑,因为这只是个阶段。就像我们现在的社会主义初级阶段一样,我们的经济是没有人家发达,但是我们需要这个过程。
只要我们肯努力,肯去钻研,那么我们就一定能找到问题的根源,只要你有这股劲。而且我相信,勤奋的菜鸟,终有一天会展翅高飞的。
中午的时候,收到了荷兰那位MVP的邮件,他首先congratulation了一下。关于Live ID 那个先登录后注册的问题,他也表述无奈。不过,令人兴奋的。Live ID API 马上就要放出一些新的功能了!
It allows you to customize the colours, text and images
也就是说,在注册的时候,可以更多的从Live Server上获取信息了。看来第二期的开发马上就不远了。
@博文仅供学习研究,所提供的代码希望大家慎用。请大家保护康盛创想公司以及Discuz!NT的知识产权,遵守相关协议。
这一篇,我来具体说一下代码中的细节问题
1.如何从live Server上获取信息。
我以前对webService 也是不太了解,但是通过这个项目了解了其中的原理。假如说我们的网站的运作非常简单,用户访问我们的页面,然后我们的服务器给用户信息,那么这个过程就是简单的交互的。但是如果一张页面中所有的信息全部从这张页面的对等服务器获取,那么效率会非常地下。而且如果涉及到第三方的信息,也会很麻烦。
所以在用户获取了我们的页面后,如果这个页面有WebService的内容,后台就会自动去其他的服务器端获取信息,然后再传回到用户的页面中去。
loginCookie = new HttpCookie(LoginCookie);
WindowsLiveLogin.User user = wll.ProcessLogin(request.Form);
if (user != null)
{
loginCookie.Value = user.Token;
password = user.Id;
这里就是获得user.id的代码
在代码中,就是HttpContext 、HttpRequest 和HttpResponse。比如说我们获取那个Live Server给的user.id。那么在用户登陆以后,HttpRequest就会向Live Server要这个数据,对于这个改造,我选择了把东西存在Cookies中去(没办法,只能这么干)。
而对于用户联系人列表的访问也是一样的,如果前者只是传一个简单的值,后者我们则要获取一张大的xml列表。首先也是HttpRequest先得到用户的许可,然后在通过一个地址跑到Live Server那里。
“报告Live 大人,那个叫赖昌星的用户允许我获取他的联系人列表”
然后通过对数据的Xml化,然后我们就得到了这些信息,解析他们就成功了。
在我做的过程中,还碰到了很多的问题。比如说 远程服务器 错误 404 400
404 这个就是我们在获取用户的许可的时候除了问题。
大家可以看一下代码中的llid 多半是这个值出了问题。
400的问题则比较特殊了,下面我再介绍
2.为什么要将联系人的 webservice单独放在handler.aspx.cs中
我们都知道了Discuz!NT的aspx页面不是一般的aspx页面。而他的后台也同样不一般。大多数的aspx后台页面都直接继承System.web.UI,但是Discuz!NT则做了一个PageBase的类,来继承System.Web.UI,然后所有的页面都去集成PageBase。
这样的好处显而易见。因为Discuz!NT有着吓人的各种参数,这样就可以让每个aspx后台文件少很多参数定义。但是他也做了很多的限制。
比如HttpContext,把访问联系人列表的部分放进register.aspx.cs这个里面,死活都不成功,总是显示远程服务器错误400。这个错误是指我们访问地址的错误,最后我实在没有办法了,只能判断是由于Discuz!NT特殊的极致导致了这个问题。
但handler.aspx.cs只是个中转页面,所以我们不需要集成那么多的参数,那么直接让他继承System.web.UI(我觉得不用继承也没什么大问题)
然后放进去以后,没问题了。
在开发者页面中提供的代码使用了session,我个人也认为session更好一些,但是无论我怎么设置都Discuz!NT都会告诉我,配置节点错误!所以无奈,还是用了Cookies
3.为什么在注册前,需要先用Live ID 登陆呢!
这个不能怪我!这个完全就是Live ID API他们搞的,我也纳闷了。他们提供了两个接口,但是前者只提供user.id。后这只能访问联系人列表。那么我在注册的时候,两个都需要访问啊,为什么就不能让后者两者都获取呢!
连官方网站上的sample都是先登陆,然后再次访问联系人列表的。索性现在是beta版本,等待正式版的修正吧!
4.为什么要将liveid作为用户的密码存入数据库
我感觉上面两项 基本上都是对 Discuz!NT的抱怨了
其实一开始,我的打算是忽略password,然后在数据库中添加Live ID项目。因为按照当初的目标,就是对代码的更改到最小。以后,或许还可以做成两种身份制并存。但是后来发现,这样反而是种很笨的做法。
这样做得对数据库进行更改,然后数据访问层,然后就是实体集。而且重要的,Discuz!NT的Cookies,他们需要把Password写入到Cookies里面。我们当然也可以更改为将Live ID写入,但是这样不是更乱吗?
而且之前我错误地估计了Discuz!NT的密码限制了。因为Live Server给的user.id是个很长的字符串,我总怕写不进去。但是后来试了一下,居然可以。然后重新做了一遍。
发现把user.id写进password是件更加舒服的做法。
首先你根本不用修改数据库。
刚才看到了,对数据库的访问层也减少到了最少,实体集基本上不用修改。
唯一比较麻烦的,就是password在写入数据库之前是需要加密的。但是后来发现,也就是一行代码的事。
不过我也有担心。
5.我们要改掉扔掉IsPost()
观察Discuz!NT的源代码。我们可以发现,Discuz!NT做页面信息的Post的时候,并不是像我们那样,页面上写个控件,然后后台写个函数,而是直接用Html的Submit,然后IsPost就被启动了,至于信息有没有返回回来,是不是,则接下来再处理。
所以在修改Login.cs,和register.cs的时候都要把他们换掉。
6.其他的注意事项
我的改造是代码量最小的了,同时他也还有很多的遗留问题。比如说,我们改造了密码项,
如果用户进入到了修改密码页面呢!如果我们在注册成功的邮件中不发送密码了也可以。但是这里还是比较麻烦,如果想要完善这个改造,还需要去掉所有有关密码的东西,包括“密码找回”等等,其实如果想完善改造,应该对整个User表做些修改。当然,这样带来的问题,就是一旦Discuz!NT升级了,你的改造就得重来。(所以康盛创想把我招了把,以后你们的Live ID 登陆版本,我负责了,哈哈)
在经过了很长时间的奋战,终于成功了
我的遗憾
当然,做完了这个改造还是有一些遗憾。
1.首先Live ID API的引入,就是让用户感受到没有用户名密码的限制。但是因为现在beta版的缘故,让注册变得有点怪异。有谁听过,先登陆再注册的,很怪异啊。
我就一直在琢磨着,去看windowsLivelogin.cs的源代码然后在使用访问联系人的API的时候,顺便把 user.id给敲下来。
2.在注册的时候,还是不能实现更多个性化的注册。比如说访问联系人列表,访问的很有限,如果能把用户更多的信息读取就更好了。我还想着,如果两个用户都是Live ID 的拥有者,他们有都在本站注册了,就直接让他们的好友关系也称为我们站点的好友关系,这样多好。不过实现起来肯定也有点麻烦。
或者是,在注册的时候,提供很多其他信息的填写,也不错。但是目前来说最好的,就是让用户在注册完了以后,自己去修改去。不过反过来想象,其实就是用鼠标点了几下,也算是蛮方便了。
3.外观
这里还是忍不住抱怨一下,因为Live ID 的登陆API,那个地址,如果你不用iframe,那么点击以后,就会在页面上显示sigin in /sign out。我就想了你就不能做成中文的了。
虽然现在英语在国内基本上快不成为问题了。但还是感觉不顺眼。
另外在Discuz!NT上想做一个好的外观,不是很方便。特别是像这样,对Discuz!NT做了换血的做法后。
我真的不太习惯在原先的aspx页面上写东西。
在改register页面的时候,1000多行,好多个if嵌套,让我改了好半天,才改好。
@博文仅供学习研究,所提供的代码希望大家慎用。请大家保护康盛创想公司以及Discuz!NT的知识产权,遵守相关协议。
感谢团队允许把这篇也放到首页来:)
这一部分,我把我大部分的代码贴出来。
1. 对数据库、数据访问层、逻辑层的修改。
其实这部分算是简单的。不过刚开始,我选择有点错误。因为我的决定是拿掉password,让password失效,然后在再数据库中写入一个Liveid的列,用来将我们得到的user.id写进去。这里的liveid指的是并不是要把用户的 Live ID号写进去。
在Live Server 给出的变量名是user.id为了不和原来的项目发生冲突,在项目中,我都用小写的Liveid代替。
刚开始,我也想过将user.id写进password这一项,但是我怕这个字符串会太长,而且怕Discuz!NT会有一些其他的要求。不过就在快做完的时候,发现还是写进password最合适,而且长度刚好合适。
这样还可以节省很多代码的工作量,基本上数据库部分可以完全不变。
我在前几篇说过了,集成了Live ID API的网站识别用户的就是通过user.id来识别的,所以我们基本上只用在逻辑层和数据访问层中加上一个 ExistPassword 和 GetUserNameByPassword 就可以了。
这里是要添加的代码
(1)Discuz.Forum 中的users.cs 中添加
/// <summary>
/// 用户的Live ID是否存在
/// </summary>
/// <param name="UserId"></param>
/// <returns></returns>
public static bool ExistPassword(string password)
{
return DatabaseProvider.GetInstance().ExistPassword(password);
}
/// <summary>
/// 根据Password返回用户名
/// </summary>
/// <param name="password">Password</param>
/// <returns></returns>
public static string GetUserNameByPassword(string password)
{
IDataReader reader = DatabaseProvider.GetInstance().GetUserNameByPassword(password );
string username = "";
if (reader.Read())
{
username = reader[0].ToString();
}
reader.Close();
return username; ;
}
Discuz.Data 中 IDataProvider.cs中添加
/// <summary>
/// 判断这里的“密码”是否存在
/// </summary>
/// <param name="password">密码</param>
/// <returns></returns>
bool ExistPassword(string password);
/// <summary>
/// 通过Password返回UserName
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
IDataReader GetUserNameByPassword(string password);
Discuz.Data.SqlServer 中 UserManage添加
/// <summary>
/// PassWord 返回UserName
/// </summary>
/// <param name="password">密码</param>
/// <returns></returns>
public IDataReader GetUserNameByPassword(string password)
{
DbParameter[] parms = {
DbHelper.MakeInParam("@password", (DbType)SqlDbType.Char, 32, password)
};
return DbHelper.ExecuteReader(CommandType.Text, "SELECT TOP 1 [username] FROM [" + BaseConfigs.GetTablePrefix + "users] WHERE [" + BaseConfigs.GetTablePrefix + "users].[password]=@password", parms);
}
/// <summary>
/// 判断用户的password是否已在本站注册
/// </summary>
/// <param name="password">密码</param>
/// <returns></returns>
public bool ExistPassword(string password)
{
DbParameter[] parms ={
DbHelper.MakeInParam("@password", (DbType)SqlDbType.Char, 32, password)
};
return Convert.ToInt32(DbHelper.ExecuteScalar(CommandType.Text, string.Format("SELECT COUNT(1) FROM [{0}users] WHERE [password]=@password", BaseConfigs.GetTablePrefix), parms)) >= 1;
}
2. 其次是外观
我们总不能让首页那个用户名和密码框就那么显眼的摆在用户面前吧!
其实外观的工作还算是简单了,让人讨厌的就是Discuz!NT的编码方式,如果是普通的aspx页面,效率会快很多的。
这里需要改变的其实就是三个页面,forumindex.aspx 、login.aspx 、register.aspx
Forumindex.aspx就是论坛的主页。这个工作量最少了。
Login.aspx 是登陆页面
Register.aspx 因为项目众多,改变最多。
所以我直接把这两个文件上传,大家下载下来自己看吧。
(更新下载地址为 Live 的 SkyDrive 下载)
http://cid-5456d4b8f95608a9.skydrive.live.com/self.aspx/把Live%20ID%20嵌入%20Discuz!NT/intergrated.rar
3. 接下来我们来配置一下 Live ID API
其实这个是非常好申请的,建议大家去听听刘学老师的课程,那里有详细的介绍。
然后我们把其中主要的几项写进web.config中就可以了。
在<configuration>中 添加
<appSettings>
<add key="wll_appid" value="000000004C00D443"/>
<add key="wll_secret" value="ideaidea0725ideaidea"/>
<add key="wll_securityalgorithm" value="wsignin1.0"/>
<add key="wll_policyurl" value="http://xiaocainiao2010.gicp.net/discuz/policy.html" />
</appSettings>
(这个是我用来测试,大家随便用了,但是不要恶意篡改就行了,毕竟别人还想看看呢)
然后我们要新建一个 Discuz.Live 的类库,里面就一个项目,就是 WindowsLiveLogin.cs
如果你嫌麻烦,直接下载我做好的吧!
(更新下载地址为 Live 的 SkyDrive 下载)
http://cid-5456d4b8f95608a9.skydrive.live.com/self.aspx/把Live%20ID%20嵌入%20Discuz!NT/Discuz.Live.rar
在Discuz.web中引入这个类库
4. 这里我们还是需要加入一个handler.aspx。我觉得这个文件就像是中转站以后,我们首先在申请Live ID API的时候填写的就是这个页面。在用户登陆完成之后,首先转向这里,这里通过一个简单的判断,来帮助用户导向需要的页面。注册好的去登陆页面,没有的拉到注册页面中去。
所以因此我们还需要在web/config目录下的 url.config文件做一下修改,因为在这里需要地址转换的。
<rewrite name="handler"
path="/handler-{0}-{1}.aspx"
pattern = "/handler-(\d+)(-(\d+))?.aspx"
page="/handler.aspx"
querystring="forumid=$1^page=$3" />
Handler.aspx页面可以为空,后台文件,都在上面的那个inergrated下载中。
至于里面的具体细节,我在下一篇中详述
5. 最后就是重量级的 login.aspx.cs 和 register.aspx.cs了
大家可以看到,我的首页只留一个一个登陆的链接,其实我希望后面所有的页面都这样做的。并不是我们只需要登陆就可以完成在站点的注册。相反我们还要二次访问用户的联系人列表。
而且在我的register.aspx.cs页面中,有一个判断的页面。这里其是因为,用户的user.id只能通过login的接口来获得。而当你访问地址本的时候没办法获得。
甚至我现在看到的很多示例代码都是这样写的,我相信还有别的方法的。但是在阅读完了WindowsLivelogin.cs这个原类库后,发现基本上只能这样。
这里是一个非常不完善的地方。我暂时这样做了
在login页面中,我对用户的判断还是给予password,也就是user.id。虽然我们可以在注册完成之后,可以通过用户的联系人列表来得到用户的用户名,再通过用户名来判断。但是大家应该知道Live ID也是允许非微软邮箱注册,你能保证所有的用户名都不同吗?虽然在我实际中发现,其实没个用户名后面,都会加个简单的@**以区分,但是我还是用user.id来作为认证,毕竟这个是唯一的。
对于一些具体的细节,我在后面的文章中会详述的。
如果您的公司缺人,并对我感性兴趣,烦请您到第五篇文章的末尾,谢谢
@博文仅供学习研究,所提供的代码希望大家慎用。请大家保护康盛创想公司以及Discuz!NT的知识产权,遵守相关协议。
首先我在这里列出一些相关的参看资料,这也是我在改造的时候参考过的东西。
Live ID
Live ID 的开发者平台
Live ID 的MSDN
http://msdn.microsoft.com/en-us/library/bb463989.aspx
示例的下载
http://www.microsoft.com/downloads/details.aspx?FamilyId=A2466ABF-9629-42D8-B991-1D3FAF2FE872&displaylang=en
刘学老师的 Live ID API的讲座
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032384439&Culture=zh-CN
K_Reverter的Accout的项目
http://www.cnblogs.com/step1/archive/2009/01/11/1373865.html
Live ID API的申请页面
https://msm.live.com/app/default.aspx (这个简洁一些)
http://go.microsoft.com/fwlink/?LinkID=130560
Discuz!NT
DNT的下载页面
http://www.comsenz.com/downloads/install
DNT官方论坛
http://nt.discuz.net/
DNT的资料页面
http://faq.comsenz.com/usersguide/nt
代震军老师的系列博文
http://www.cnblogs.com/daizhj/category/116704.html
Live ID API
1.咱先说一下 Live ID API
Live ID API,其实在很早以前就有过类似的产品,但当时微软还对这项服务还收取费用,随着MSN越来越普及,还有hotmail邮件用户的增多,以及云计算平台概念的提出,微软在去年四月份公布了自己的Live 计划,而在今年,Live又被整合到了微软的Azure云计算平台中。
Live ID API给其他的网站提供了一套身份验证极致,以及微软的联系人列表的访问。
简单地说,Live ID API 就有两个接口,一个是身份验证的login,另外就是访问联系人列表的接口。当然,我很奇怪,都一年多了,还是beta版本,而且两个版本分得特别开。我在后面会详细提到。
通过login的借口,微软的Live Server会给我的站点一个user.id。这个并不是大家想当然的用户的Live ID号。这是个类似密码的东西,他不仅仅对每一个用户是唯一的。如果你申请了Live ID API,同一个用户在你的站点上留下的User.id,和在别的使用Live ID API的网站中留下的user.id都是不同的。
而他也是我们的站点需要保留的,通过它,我们就可以验证这个用户是否权限访问我们的网站了。
2.Live ID API的大致流程
大致的流程是这样的。
1. 用户来动我们的站点,然后通过我们站点提供的地址访问一个登陆页面。
2. 用户登陆了,Live Server给我们的网站一个 user.id号
3. 我们看看,诶,这不是那个老张吗,常客常客,然后打开大门。
4. Live Server把页面返回到我们的页面,然后我们的页面对用户开放了。就这么简单。
我感觉,Live ID更像是看家狗一样。
但是同样问题也就来了。因为login的接口告诉我们的只有这个user.id。其他的呢,sorry,这里你就需要用到联系人列表了。
不知道大家去没去过开心网。在开心网上,大家输入自己的MSN账号,然后开心网就能自动导入你所有的联系人列表。
可能这样的大网站和微软都有协议,所以我们只要输入就可以了。而对于小站点来说,当你需要访问用户的联系人列表时,就需要经过用户的同意,然后Live Server就会把联系人列表返回到这个网站上了。
同样,我们也可以通过这个功能来获取每一个用户的联系信息。
所以联系人列表的接口,就给我们提供了方便。
3.Live ID API的申请,还有一些主要参数的介绍
Application Name 是你的应用的名称
Return URL 返回的地址,就是在成功登陆,或者访问地址本后,要返回的页面 不过这个在后面的实际编码过程中,都可以修改
Domain Name 这个你的应用的,域名域
Secret Key 秘密字符串,也就相当于密码了
不过使用这个API在实际操作中,并没有想象中的便利。在后面的文章我会提到的。
有朋友说,这部分讲的很乱,我承认。身份验证应该是一个很重头的地方,对于一个网站来说。而这次要引入第三方的验证极致,当然会让人比较晕。我一开始也挺糊涂,不过建议大家最好去下两个Live ID API 的sample。代码都很简单,看一遍基本上就都懂了。
Discuz!NT
1.我眼中的Discuz!NT
我想这个应该不用提了吧!虽然大家了解的更多的是她的PHP版本。但是实际上.NET的版本也是非常优秀的(他们说的)。
这里,我想说一些对于这个改造的实现来说的一些重要的内容。
a.怎么说呢!我承认,Discuz!NT的架构设计非常优秀。但是有点固步自封了一些,而且为了实现自己的一些功能,而丧失和很多其他网站兼容的便利。首先就是数据库。如果一个网站要整合Discuz!NT的论坛,除非一开始就使用Discuz!NT的数据库,不然真的做起来着实需要花一些功夫。
b.其次他并没有用很多具有.NET平台特色的东西。比如MasterPage,对于类似我这样的菜鸟,这个东西在初学的是经常要用的。当然,还有很多其他的东西。
我建议大家打开Discuz!NT的源代码,然后打开一个aspx页面。如果以前没看过,你不蒙才怪呢!
我们都知道,.NET的原理是,首先通过.NET framework对我们的aspx页面解析,然后把他们编译成html页面发送到客户端上。而Discuz!NT的可好,直接做一个大的服务器控件,反而把所有的html的内容,嵌入到这个服务器控件中去。所以出来的效果一定可以完整保留html设计的东西。这对于很多使用html技术的站长来说是天大的好事。因为这样可以使用简单地使用HTML来编辑我们的页面。
可是我就是在是搞不懂了,老大,没看到这么多高校中都开了asp.net的课吗?有必要那么吝啬吗?如果用MasterPage对于.NET程序员来说,更容易编辑。(这当然纯属牢骚了,因为后面在改外观的时候费了好大的劲)
我总认为,Discuz!NT是披着一层.NET皮的PHP狼
c.再次是他的整个构架。
我并没有说Discuz!NT不好,我的牢骚更多的处于自己的.NET程序员身份。Discuz!NT为实现一些自己的功能,可谓是煞费苦心。但是也得说,整个架构非常紧凑,如果第一次感觉不理解,多看几遍,就会感觉好很多。
这里特别想说一下Discuz!NT的地址转换。其实博客园也用到了HttpModeul,这在我们一般的开发中并不常见到,刚一开始我很不习惯的。当然现在好了。
关于Discuz!NT的模板系统(就是aspx页面中的那些html)还有这个地址转换,都在代震军老师的博客中有介绍过。大家可以去那里详细学习。
可是这也太过于封闭了。比如我们要进行编辑,总会受到他的一些限制。我在这个过程中,体味颇深,好几次差点放弃了,不过最后还是找到了解决的方法。
d.Discuz!NT开源仍然是犹抱琵琶半遮面。
Discuz!NT开源。我不是很了解开源,但是感觉Discuz!NT的开源就是给你一个毛坯。就那个一个简单的例子,加入我们去下载到Discuz!NT的源码,然后你用VS打开,然后发布Disney.Web项目,你是不可能得到在网上发布的Discuz!NT产品的。
用户的朋友都知道Discuz!NT有一个非常傻瓜的安装系统。可是我至今都没搞明白这个安装系统到底是怎么完成的。
源码我也看了,对HttmModeul的开启,然后数据库的部署,然后写入管理员账户。
我还监听了整个网站根目录文件夹,然后我自己手动来做这些东西,还是不成功。
当然我也在Discuz!NT的官方论坛发了帖子,代老师、戏水老师也发了邮件。结果论坛的帖子石沉大海,代老师基本上没回应,戏水老师一句“你可以看源代码”就直接把我打发了。也不知道是真的不想告诉我,还是瞧不起我。
(这里是在开玩笑的,戏水老师不要当真,等您闲了,那个问题得向您好好讨教讨教)
不过菜鸟也有菜鸟的方法。首先我们可以用一个Discuz!NT产品进行安装。然后我们可以替换掉bin文件夹,这样就可以完成对源码的修改了。如果想改其他的,安装好了以后自己动手就行了,效果一样。
说了这么多Discuz!NT的坏话,戴老师,您别生气啊!
也许你会说,选别的不行啊!不行,就因为这个是Discuz!NT国内最优秀的开源论坛,这样做做出来才有意义,才有挑战,最后完成后,的征服感越强。
好了下一篇来介绍整个系统的一些大致的代码
@博文仅供学习研究,所提供的代码希望大家慎用。请大家保护康盛创想公司以及Discuz!NT的知识产权,遵守相关协议。
1.有一天,我这么想
该怎么说康盛创想呢?首先对戴志康先生,自然是顶礼膜拜了。其次,也很感谢他带来了论坛的普及,以及SNS网站的泛滥。其实不仅仅是康盛,技术越来越普及,服务器硬件的价格越来越便宜,让我们现在的网站越来越多了。但是大家的模式出奇地统一,来个地方就得注册,然后用户名、密码、密码提示问题、邮箱,乱七八糟的。特别是一些论坛,要下载什么东西,都需要回复,有的时候注册完了,还不让发帖。这让我恼火了很多次了。我就一直在想了,什么时候,可以不用记这么多乱糟糟的用户名密码该多好啊!
去年,微软的Live ID发布了。据说以前这个东西还是需要收费的,现在他开放了对所有程序员的接口,注册使用也都很简单。
还有,就是康盛创想的Discuz终于有!NT系列的.NET版本了,而且开源了。所以我就一直在琢磨了,如果能把Live ID嵌入 Discuz!NT那该多好。这样用非常低的成本,就能带来非常好的用户体验。
2.Live ID API 让梦想成真
Live ID有MSN的用户,Discuz也是有很多.NET平台选择的。
经过努力的奋战,终于在昨天吧Live ID成功嵌入Discuz!NT。当然,目前的东西还不完美,但在这个改造过程中却让我受益良多。特别是Discuz!NT源码的分析,因为Live ID需要涉及到第三方的数据连接,这其实就是WebService的东西了。以前写东西,写好了后,在本机上调试就可以了。但是这次则很不同了。
虽然Live ID 和 Discuz!NT看起来名头很大,但是只要用心,我们小菜鸟都可以成功嵌入进去的。
在技术水平上我还狠贫弱,在整合的过程中,走了不少弯路。如果最后的改造即费时又费劲,肯定不划算。所以,我也给自己定了目标,就是尽可能少的修改Discuz!NT的源代码。虽然是用Live ID登陆,但是希望在登录完成之后,效果要达到和普通注册过一样。因为Live ID API还提供了访问联系人的接口,所以用户的 Live ID( 电子邮件账号) 作为用户的emial,然后用户名也可以从Live ID 开放的联系人列表中获得(这里可以获得Live ID主人的信息)。
理论上就达到理想的效果了。
如果做的好,也许还能使用Discuz!NT的更新补丁呢。这次真的收获颇丰,所以我也决定把做这个整合的经验写出来。
要做这个东西,首先我们要对Live ID,还有其运行原理有个了解。其次对于Discuz!NT也要知道很多,这样才能下手。
和很多多层架构的网站一样,其实Discuz!NT的身份验证系统也是很传统的,但是和其他网站比起来,Discuz!NT在验证极致上,做的更加优秀,也因此改造起来也有点困难。
3.大体思路
首先,按照Discuz!NT的身份验证系统做三层分析。
前台的获取用户输入的参数这一层
中间的逻辑层,一些参数判断
数据访问,和最后的数据库
如果要把Live ID嵌入进去,也就是要在这三层之中加入相应的内容。首先逻辑层要有对Live ID的判断, 数据库要有Live ID的列,最重要的也就是前段页面了,这里的部分最复杂,最让我头痛。
所以我也按照我的整个思路,分开写。
2. 第二篇,对Live ID 还有 Discuz!NT一些相关的东西做一个详细的介绍
4.最后
前面说过了,作为新手的我,在文字中,可能还有很多不正确的地方,也希望大家能够批评指正。
5.关于系列博文的法律声明
系列博文使用了康生创想公司的Discuz!NT产品作为主要的演示对象,来介绍如何将微软公开的Live ID API集成到一个现有的传统论坛和网站中。
博文中发布的所有的代码仅供学习交流,请勿做商用,其他使用也请慎用。康盛创想是一家知名的IT厂商,也请大家共同保护康生创想公司、Discuz!NT及其团队的知识产权!
因为自行将本系列博文中提供的代码非法使用,并对康生创想公司造成经济损失的与本博客无关。
(好官腔啊!虽然后面提到了商用的东西,但是还希望大家慎重啊!)

