# Sunday, December 17, 2006

首先最值得庆祝的是VS2005 SP1在本月15日发布,我在第一时间下载并安装了。该补丁包中最让ASP.Net应用的开发者高兴的恐怕就是Web Application Project的引入了,使用VS2005中文版ASP.Net开发者终于有福了。

而且在VS2005 SP1中的Web Application Project的页面设计视图右键菜单已经有View Code(查看代码)项了。
 

安装VS2005 SP1之前最好先看看这个知识库的925336号文章,不然您可能会安装失败。也就是您最好先做如下图配置:

大家要了解VS2005 SP1可以先看看:

Visual Studio 2005 Service Pack 1

Visual Studio 2005 Service Pack 1 发行说明

第二件比较好的事情就是ASP.Net AJAX(Aatlas)的RC1发布了。

这次的修改内容可以到http://ajax.asp.net/files/AspNet_AJAX_CTP_to_RC_Whitepaper.aspx#link8查看。其中几点重要变化是:

  1. 编译文件由原来的Microsoft.Web.Extensions.dll 变为System.Web.Extensions.dll;
  2. 命名空间也从Microsoft.Web.* 变为 System.Web.*;
  3. registerNamespace修改为Type.registerNamespace();
  4. 附带安装了AJAX-Enabled Web Application项目模板,可以在VS里直接创建AJAX的ASP.Net应用。

PS:RC就是Release Candidate(候选版本)的简称。从微软的惯例来看推出RC版操作系统就代表正式版的操作系统已经离我们不远了,因为微软操作系统的开发步骤是这样的:内部测试->alpha公测->beta公测->RC版->正式版上市;通常微软的RC版本筛选会经历2-3个过程,也就是说微软会推出RC1、RC2或者RC3的操作系统,而随后就是正式版操作系统上市了,因此通常来看RC1版操作系统已经同最终零售版操作系统相差无几了。

posted on Sunday, December 17, 2006 7:06:34 PM (China Standard Time, UTC+08:00)  #    Comments [3]
# Tuesday, November 21, 2006

微软反跨站攻击脚本库 v1.5。此下载包含Microsoft Application Security Anti-Cross Site Scripting Library的分发组件.Anti-Cross Site Scripting Library可以为网站开发人员提供基于Web应用防护,以抵御源自 Cross-Site Scripting (XSS跨站漏洞)的攻击.支持.NET Framework: 2.0, 1.1

下载地址:http://www.microsoft.com/downloads/details.aspx?FamilyID=efb9c819-53ff-4f82-bfaf-e11625130c25&DisplayLang=en

相关文章:http://blogs.msdn.com/kevinlam/archive/2006/07/07/659531.aspx

posted on Tuesday, November 21, 2006 8:22:02 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Saturday, November 04, 2006
烟台.Net俱乐部网站近几日出现了异常报告,于是调查了一下站点的IIS日志,进行了分析,发现了100次以上的非法访问的IP情况如下:
尝试次数 IP地址 所属地区
4904 211.64.120.192 山东省济南市 山东交通大学
223 74.6.74.159 美国
190 222.80.77.209 新疆喀什市 电信
181 202.108.211.101 北京市 网通
160 222.183.217.187 重庆市江北区 电信ADSL
148 124.156.191.67 中国
112 222.88.189.247 河南省鹤壁市 电信ADSL
100 220.169.248.6 湖南省衡阳市

以这里的第一名211.64.120.192的访问情况为例,其访问的俱乐部网站路径如下:

于是乎把他的IP封锁了,索然这本身没有什么效果,但是对该“黑客”的行为表示痛恨。不过呢其实最痛恨的也不是他啦,最痛恨的是那些疯狂的搜索引擎爬虫,baidu,sogou的爬虫都不是什么好鸟。而且看到很多网站在为这个问题而头痛,希望大家一起努力可以想到一个好的办法来解决这个问题。近期我也会尝试分析和解决这个问题。

posted on Saturday, November 04, 2006 9:33:44 PM (China Standard Time, UTC+08:00)  #    Comments [0]
# Monday, October 30, 2006

近来微软的产品和服务在中国的本土化在不断的改进,比如说针对中国用户的正版增值(PS:Microsoft Cartoon Maker挺好玩)、微软asp.net官方站点的中文版(http://asp.net/cn)、MSDN Magazine中文版(http://msdn.microsoft.com/msdnmag/issues/06/11/default.aspx?loc=zh)……这些都是值得称赞甚至可以说惊喜的。但是作为开发者我们来说,似乎还没有看到VS2005的Web Application Project中文版的出现,致使部分狂热爱好者甚至采取一些极为复杂的办法去实现在中文的的VS2005下使用Web Application Project,微软为何不出个官方的中文版本,以便使用中文版VS开发工具的开发者们更方便的从VS2003转向VS2005呢?期待中……

posted on Monday, October 30, 2006 11:11:40 AM (China Standard Time, UTC+08:00)  #    Comments [6]
# Tuesday, October 10, 2006

我们在上网使用搜索引擎的时候,经常会遇到类似这样的一个问题:从Google上搜索到了一个包含了“税收”的文章,但是打开对应的网站页面时发现这篇文章很长,很难确定税务在文章中的位置,即使使用浏览器的查找功能,也并不爽。那么如何改进信息类网站在此需求上的用户体验呢?一个国外的朋友做了件好事情:http://www.kryogenix.org/code/browser/searchhi/,他在这个页面上提供了一个js,可以很方便的实现我们的需求。但是这个脚本对baidu没有什么效果为什么呢?首先我们看看他的部分代码:

……
if (qsip[0] == 'q' || qsip[0] == 'p') { // q= for Google, p= for Yahoo
words = unescape(qsip[1].replace(/\+/g,' ')).split(/\s+/);
for (w=0;w<words.length;w++) {
highlightWord(document.getElementsByTagName("body")[0],words[w]);
}
}

……

上述代码获取来源地址中q或p的值,q对应的是google的搜索关键字,p是Yahoo的搜索关键字,而且这两个关键字是utf-8编码的,使用js自然可以很方便的处理,但是百度搜索的则有较大不同:搜索关键字的对应的地址参数是wd,且编码为GB2312。如何解决这个问题呢?我这里使用了js结合vbs的办法来解决该问题。

首先我们使用vbs写一个函数解决编码问题:

Function DeCodeAnsi(s)
Dim i, sTmp, sResult, sTmp1
sResult = ""
For i=1 To Len(s)
If Mid(s,i,1)="%" Then
sTmp = "&H" & Mid(s,i+1,2)
If isNumeric(sTmp) Then
If CInt(sTmp)=0 Then
i = i + 2
ElseIf CInt(sTmp)>0 And CInt(sTmp)<128 Then
sResult = sResult & Chr(sTmp)
i = i + 2
Else
If Mid(s,i+3,1)="%" Then
sTmp1 = "&H" & Mid(s,i+4,2)
If isNumeric(sTmp1) Then
sResult = sResult & Chr(CInt(sTmp)*16*16 + CInt(sTmp1))
i = i + 5
End If
Else
sResult = sResult & Chr(sTmp)
i = i + 2
End If
End If
Else
sResult = sResult & Mid(s,i,1)
End If
Else
sResult = sResult & Mid(s,i,1)
End If
Next
DeCodeAnsi = sResult
End Function

然后在js中调用这个vbs的函数:
if (qsip[0] == 'wd') { // wd= for baidu
if(qsip[1]=='') continue;
execScript('wd = DeCodeAnsi("'+qsip[1]+'")','vbscript');
words = decodeURI(wd.replace(/\+/g,' ')).split(/\s+/);
for (w=0;w<words.length;w++) {
highlightWord(document.getElementsByTagName("body")[0],words[w]);
}
}

ok问题解决了。

使用的时候在网页中加上以下两行就好了:

<script src="/searchhi.js" type="text/javascript"></script>
<script src="/searchhi.vbs" type="text/vbscript"></script>

searchhi.js (2.23 KB)
searchhi.vbs (.93 KB)

posted on Tuesday, October 10, 2006 11:55:25 AM (China Standard Time, UTC+08:00)  #    Comments [2]
# Friday, September 29, 2006

      一个asp.net应用中,可能我们有时候会需要处理一个可能长时间执行的任务。比如说将新闻内容生成静态页面,如果在asp.net中调用方法来处理,很可能引起超时操作,而且我们也无法获知当前处理的进度情况。那么我们应该如何解决该问题呢?答案是使用Thread+AJAX。

      基本的解决办法是,首先我们将可能长时间执行的程序放在一个Thread中执行:
Thread tr= new Thread(new ThreadStart(ArticleCreate));
tr.Start();

      然后在执行过程中将执行的进度数据存在Session中:
private void ArticleCreate()
{
    string sqlStr="select * from article order by id asc"
    DataSet ds=……
    int tCount =ds.Tables[0].Rows.Count;
    for(int i=0;i<tCount;i++)
    {
        ……
        Session["c_pro"] = (i+1)*100/tCount;
    }
    Session["c_pro"]=100;
}

      再后,我们使用AjaxPro.Net从客户端读取服务器端的Session值:
[AjaxMethod(AjaxPro.HttpSessionStateRequirement.Read)]
public int tmethod()
{
    return (int)Session["c_pro"];
}

注意红色字体部分,这是必要的参数,否则无法在AjaxMethod中使用Session,进而在客户端也将无法调用。

客户端进度条的实现可以参考我的改进版的渐变效果进度条fingerscrossed

posted on Friday, September 29, 2006 11:02:37 AM (China Standard Time, UTC+08:00)  #    Comments [1]
# Sunday, September 10, 2006

声明:本作品属于Demo级别,功能并未完整实现,供.Net俱乐部会员学习使用,高手就不必看了

授权:开源&&非商业化使用

作者:qihangnet,phenge

技术:SqlServer2000+C#+Asp.Net1.1
         存储过程
         自定义实体
         自定义实体集合
         I/O
         反射
         接口
         IDataRecord
         数据缓存
         Form认证
         三层结构
         工厂模式
         ……
文档:(电信)Qihang_CMS.chm (网通)QihangCMS.chm

代码:(电信)Qihang_CMS.rar (网通)Qihang_CMS.rar

数据库备份文件:(电信)qihang_cmsDB.rar (网通)qihang_cmsDB.rar

参与讨论:http://qihang.net/forums/thread/2908.aspx

posted on Sunday, September 10, 2006 12:35:56 PM (China Standard Time, UTC+08:00)  #    Comments [3]
# Sunday, August 27, 2006

String.Split 方法:标识此实例中的子字符串(它们由数组中指定的一个或多个字符进行分隔),然后将这些子字符串放入一个 String 数组中。

Regex.Split 方法:在由正则表达式匹配项定义的位置将输入字符串拆分为一个子字符串数组。

上面的两个Split方法,在使用单字符拆分字符串的时候效果一样。然而在使用多个字符拆分字符串时,就有所区别了:

Srting.Split(字符串.ToCharArray())得到的结果往往不是我们希望的结果。所以在此推荐使用Regex.Split方法处理使用多字符拆分字符串。

posted on Sunday, August 27, 2006 11:45:34 AM (China Standard Time, UTC+08:00)  #    Comments [0]