最近由于工作需要,建设了一个ASP.NET网站,在美国Godaddy上购买的主机. ( 顺便鄙视一下国内的域名主机服务商,又贵又烂,技术员还经常很随意的修改服务器,造成不可预计的问题.) 说说网站建设和使用过程中的一点经验. ( 商业原因, 网址我不方便透露,抱歉.)
我在建设和使用的过程中碰到一些问题, 网上搜了好久,很多都没有好的解决方案, 幸好,目前我的网站运行已经比较完美,所以写点东西放上来, 希望能给碰到类似问题的同志一点帮助. ( 我太理解为一个莫名其妙问题困扰的心情了. 程序员都不容易 :-)
1. 服务器主机
前面已经说过, 如果对国内网速要求不是特别高 ( 一般的访问没问题,飞快.), 建议到Godaddy 购买, 很便宜. 我的150G Windows 主机加域名大概付了200美元左右,带独立IP地址 ( 现在又更便宜了). 他们的服务还可以, 给发的邮件都有回.
2. ASP.NET, JAVA, PHP.
现在好像和流行做类似的对比,作为程序员,我也是这么过来的,理解.
我的看法是:无所谓.
ASP.NET, JAVA, PHP 等等,只是工具,只要能实现你的商业目的,达到功能性能要求就可以. 作为老板,并不关心你用什么语言(我的话可能俗了点,但是是事实). 所以只要选一个比较熟悉,或者比较喜欢的用起来就可以了. 就我自己而言,因为以前开发C++/MFC的,现成就有Visual Studio 2005,所以就用ASP.NET了.
编程到后面,其实都一样,来来去去就那么些个东西.我不敢说窥到了什么本质,一点感受而已.就像操作系统一样,不论是Windows还是Linux,不都是那些东西吗? 做系统编程为什么可以用POXIS规范写出统一的代码?我想就是因为所有操作系统本质上都是类似的,总要用到线程,文件,进程,通信,同步等等等等. 做网站也是一样,无非就是根据用户请求,动态返回响应流嘛,不论JAVA, ASP.NET, PHP 在这点上都是一样的,实现上也大同小异.
如果是新手, 不要过于在意语言工具, 选一种你看得顺眼的, 用起来. 熟练之后触类旁通. 如果你精通ASP.NET,让你写JAVA代码,估计有2个星期训练一下,足够. 反过来也一样.
要我说,难点在于美工,怎么排版配色,让网页看起来赏心悦目,真是一门学问...
3. 最大的问题是碰到
“验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。”
我总结了一下,发现在以下这种情况的时候比较容易出现这个黄页错误:打开网页后,放一段时间,大概是等Session过期的时间,然后执行一个Postback操作,必出.
事实上,我的网站只有一个主机,不可能是什么集群,而且根据Gooogle搜来的一些提示,我也没用数据库绑定的控件.(我一向比较反感数据库绑定控件,喜欢自己编排结果.)
刚开始的时候找到一篇文章(具体内容忘记了),说是把ViewState之类的加密全部设置为 "Never",不仅不安全,而且也没效果(至少我这里没效果).
后来实在没办法了,抱着姑且一试的想法,在 web.config 添加了<machinekey>配置,居然一举成功,从此再也没见到这个黄页面. (到现在网站已经稳定运行6个月.)
由此,根据黄页提示和实际经验,认定应该是使用了不同的machinekey的原因. 按照微软的说明,同一台机器同一个网站实例运行起来后应该不会再产生一个不同的machinekey, 但是也许有什么BUG导致.net框架在某种情况下,如果你在web.config没有指定,它又生成了一个随机的machinekey,导致和之前的不同,最终导致上面的黄页出现. 当你指定了machinekey之后,.net框架不再重复生成,所以不会有解密失败的问题.
以上是我个人猜测,没有经过测试和理论验证,如果您有什么见解,务必请您告知我一下,非常感谢.
另外, http://aspnetresources.com/tools/keycreator.aspx 可以生成machinekey放到你的 web.config中. 也可以自己生成,能google到相关代码.
4. 母版页
用母版页能够很方便的是所有的网页都保持一个统一的风格. 但是同样会带来一些问题: 控件ID会被自动修改.
这是我不喜欢的,我写的代码,凭什么瞎给我改名字? 使很多JavaScript代码编起来很麻烦.
不知各位有什么办法不用母版页而达到同样目的(保持统一风格)?
5. 关于Session_End 执行的问题
由于网站规模不大而且只有一个主机,所以把Session都放在内存中, 在Session_End 里设置用户的状态, 目的是统计在线人数.
运行一段时间发现Session_End经常没有被执行, 确定不是代码的问题, 我在本地机器上测试时没有问题的. 也许是服务器压力比较大,或者什么别的原因.
后来出于偶然,把服务器升级到IIS7.0 (之前是IIS 6.0), 发现Session_End的执行情况居然大有好转,大概在95%以上. 有3个可能的原因:
(1) 服务器软硬件环境的问题,因为升级到ISS 7.0 后会迁移到另一台服务器.
(2) IIS程序的问题,也许IIS6 有什么BUG,到IIS 7解决了.
(3) 我在web.config指定了 Session的配置, 虽然都是默认配置,但是都显式写在里面 <sessionState mode="InProc" timeout="20"></sessionState>, 根据"MAC验证失败"的经验,被搞怕了.
总之就做了以上3点改变,Sesssion_End执行情况就大致达到要求了,在线人数统计非常准确.很遗憾,我这里的条件不允许我做进一步测试找出哪条是真正原因.如果您有结果,希望您能告诉我一声,非常感谢.
6. 数据库分页
数据库是我的弱项,数据量大的时候最好能够实现分页查询. 不过我这里都没有做. 主要是网站规模不大,没有需求.
今后有什么新的体会心得,我会继续更新这篇文章, 如果您有什么心得体会, 欢迎交流. [email protected]
再说一个题外话, 米线的<<情迷唐古拉>>专辑真好听 -_-!