January 2007 - Posts
Windows Vista已经正式发布了,其实这也意味着.NET 3.0也正式发布了。只不过可能很多开发人员并没有真正意味到此种含义,现在已经到了使用.NET 3.0开发的时代了。我这儿还是主要专注于.NET 3.0中的WPF("我佩服")这一部分,很多人可能并不清楚WPF到底能够实现什么,或者有人参加过TechEd,看到过一些Hello World的实例,但总觉得意犹味尽,那么今天开心带大家到互联网上来体验几个真真正正的实在运行的WPF实例。
首先向大家推荐的就是New York Times(《纽约时报》)的离线阅读器了,对于希望学习英文的朋友这应该是一个比较好的例子。不知道各位看官有多少在每天早上到办公室后先到纽约时报的网站上查看当天新闻的。毕竟基于互联网阅读可能还是不太习惯,那么,赶快下载这款离线阅读器吧。
真正的物有所值。这款阅读器实现了Smart Client(智能客户端)的特性:
- 在联机时自动下载最新的新闻信息到客户端;
- 可以进行本地阅读,在阅读时可以根据需要改变字体大小,并且实现了自适应排版;
- 根据排版中的留白大小,自动插入合适的广告信息;
- 非常棒的导航功能,可以在各栏目,各条目之间进行自动导航;
- 强大的批注功能,可以使用文本或者墨水功能对其进行批注,并且将批注信息通过邮件与朋友分享;
- 支持打印,可以将当天的报纸进行打印;
- 强大的搜索功能,除了按照关键词搜索罗列信息外,还可以使用Tag(标签)功能列举相互的关系;
其次向大家推荐的就是大英图书馆(http://www.bl.uk )的在线图书借阅工具,大家知道,大英图书馆提供了很多珍贵的书籍,包括莎士比亚著作的原始版本,很
多都是羊皮书,非常珍贵,可能不能让大家频繁借阅,而这个工具解决了这个难题。另外如果大家听过开心讲WPF的课程,基本上罗列了WPF帮助我们解决日常开发中的两个矛盾的问题:第一个是开发人员与设计人员协作开发的矛盾;第二个则是B/S与C/S的两难选择的矛盾。而大英图书馆的这个在线阅读工具可以让我们体会到WPF在制作B/S界面上的强悍之处。当然,这个在线版本也实现了Click Once技术的应用(在线体验: http://ttpdownload.bl.uk ):
- 强悍的3D特征,请注意在您翻看书页时的书的光影、质感;
- 更加拟自然的方式来表现书的内容,模拟我们日常生活中的翻书效果;
- 放大镜功能,如果对某些文字需要看得更清楚,可以使用此功能;
- 移动翻转功能,可以将书进行随意的移动,或者进行翻转查看;
- 注释功能,可以在羊皮书上撰写自己的注释;
日后我们会向大家推荐更多实例,其实中国的互联网行业不缺乏创意,但在2006年,一直出现一种跟风现象,就是Copy 2 China (C2C)现象。大家举眼望去,目前在国内有多少视频社区,而这些视频社区均是沿袭Youtube的创意。国外有别针换别墅,国内马上有人闻风而动。国外有百万格子网格,国内也立即出现。到了2007年,我们不能老是沿袭这些老路,应该有更多的自己创意了。
曾经在Cnbeta.com的网站留言中看到有朋友说:据说今年是Gadget年。我说错了,去年是Gadget年,而今年,将会是WPF以及WPF/e年。在不久的将来,相信会在国内看到很多WPF的应用。
而您,如果是互联网从业者,不妨与我们进行联系,我们将会为您开发WPF或者WPF/e应用提供相应的帮助。本站上的唐海洋(前Visual Studio产品市场经理,现在负责Expression产品线)也将会帮助您熟悉这款产品。
WPF年已经来了,您还在等待什么?
Microsoft曾经大肆鼓吹Software Factory,而在SOA(Service-Oriented Architecture)在大型项目开发中崭露头角时,我们就不能忽略Web Service Software Factory,尤其是在Microsoft重磅推出WCF(Windows Communication Foundation)的前提下。
Web Service Software Factory通常简称为Service Factory,它不仅仅是一种软件设计思想,准确地说它集成了开发工具、模式、设计向导、文档以及源代码。通过它,能够帮助开发者通过架构设计、模式以及WCF等快速地创建Web Service。Service Factory的架构如图所示:

主要内容包含:
1、设计ASMX和WCF消息和服务接口;
2、建立统一的异常处理机制;
3、为领域模型创建业务实体对象;
4、完成业务实体对象与消息的转换;
5、设计、创建、调用数据访问层;
6、服务的实现、配置与安全;
7、项目向WCF的迁移;
8、为WCF服务实施安全;
9、提供消息的验证;
有关Service Factory的详细情况可以访问http://msdn.com/servicefactory。
为了更好地帮助开发者理解Service Factory,Microsoft还提供了Service Factory Hands-on Lab。它提供了一套完整的练习,分别包括:
练习1:创建解决方案;
练习2:创建数据类型;
练习3:创建消息类型;
练习4:创建服务操作(Service Operation,类似于Web Service的Web方法);
练习5:创建业务实体对象;
练习6:完成业务实体对象与消息的转换;
练习7:创建存储过程;
练习8:创建数据访问类;
练习9:调用数据访问层;
练习10:测试与客户端调用;
Service Factory Hands-on Lab是以一个实际的例子来开展的,其目的是为一个虚拟的酒业零售商Coho Winery提供会员服务。通过该练习,你可以从中体会到分层式架构设计、SOA的“服务自治”、基于消息的分布式处理系统、WCF、数据与消息以及单元测试、设计模式等诸多具有价值的技术与思想。
如欲了解Service Factory Hands-on Lab,并下载相关工具与代码,请访问What you'll see inside the lab 。此外,要了解与关注Service Factory,可以访问http://www.codeplex.com/servicefactory。
今天上午参加了微软的Windows Vista大众市场发布会,不知道有多少位博客堂的老友们参加了此次会议。除了在嘉里饭店宴会厅的主会场以外,我们在各大卖场如中关村e世界以及国美电器等,还会持续举办Vista体验活动,欢迎各位博友继续参加。
让大家久等的博客堂2007年度“不谈技术”年会,也即将于本周六拉开帷幕,欢迎各位报名参加。此次年会,将以交友识朋为主要目的,而不是无休止的技术讨论。唯一与技术相关的可能就是“博客堂2007版程序”预览环节了,希望在此环节当中得到一些关于新系统的反馈(此次程序改动非常大,包括最新的邀请制环节等,暂时保密)。
此次年会也得到了MSRA的大力支持,届时微软亚洲研究院会有多位同事参加。博文视点的朋友也会参加此次会议,来者均是能歌善舞的。IT界的钻石王老五郭安定先生也会参加。
所以您还在犹豫什么?赶快报名参加此次会议吧。
请在此贴后面跟贴报名,请注名您的网名、真实姓名、公司名称以及职位。另外,在参加时,请随身携带足够数量的名片以及价格不高于五十元的礼品。:)
其它事宜请参见预告。
时间:2007年2月3日下午13:30入场, 14:00开始至17:00
地点:北京市朝阳区霄云路38号现代汽车大厦18层100人会议室
【原文地址】 Video: Using LINQ with ASP.NET in VS "Orcas" (Part 1)
【原文发表日期】 Sunday, January 28, 2007 11:28 PM
我今年的一个目标是在博客中多用录像。我的看法是这样,很多时候,用来示范某样东西是怎么工作的,较之于比文字,录像是更好的媒介,也可以帮你避免由阅读我的一些非常长的博客帖子而带来的沉闷,单调,乏味。。。
在下几个月里,我会尝试着每隔一个星期就各种主题创制一个新录像。很多这些录像会涉及对随Visual Studio Orcas而来的一些新的特性的初览,Visual Studio Orcas是将于今年晚些时候发行的新版本。至于今天的录像,我决定着重介绍 LINQ,我认为LINQ是随Orcas而来的最激动人心的特性之一。
在高的层面上看,LINQ使得查询的概念成为.NET中一等(first class)的编程概念。通过使用LINQ,你可以轻松地查询关系数据库,XML文件,以及任何普通的.NET对象。你也可以轻松地在LINQ中使用你自己的数据源抽象来为各种数据提供器提供丰富的域模型(domain models)。想看一个精彩的例子的话,参考Fabrice的LINQ到Amazon的实现,这个例子支持了对通过 web-service 呈示的Amazon数据的LINQ查询。 作为 Orcas 发布的一部分,VB 和 C# 两者都提供了与LINQ丰富的语言级的集成,包括完全的 Intellisense,编译时检查和调试支持。
观看或者下载录像
第一个录像从一个新项目开始,然后示范对一个SQL数据库使用LINQ来建立一个简单的数据报表网页的基本知识,内含对从多个数据表计算出来的聚合值,以及效率高的服务器端数据库中分页的支持。
你可以在这里在线观看这个录像(总长度为24分钟)。或者如果你想保存在本地观看的话,你也可以在这里下载一个 .zip版本。注意,它也许会花30-60秒钟来做缓存,因为这是个大的录像。万一我的服务器请求太多不堪重负的话,我会在这个星期的晚些时候更新网址,并将它发布到一个微软的录像服务器上去。
想了解LINQ的详细信息的话,包括我自己的“使用LINQ建立数据驱动的ASP.NET应用”讲座的讲义和演示代码,请查看一下这里一个我以前的帖子。至于其他的ASP.NET 2.0技巧,诀窍和教程,请查看我的ASP.NET技巧/诀窍汇总列表网页。
这个录像里讨论的主题细节
这个录像里的示范举例说明了几个新特性:
1) 对新的所见即所得(WYSIWYG)HTML设计器一些功能的简短示范(包括分割界面和对新的CSS管理器的简短介绍,我将来会在另外的录像里对两者做详细讨论):
2) 如何使用VS Orcas中的LINQ到SQL的新ORM设计器来创建模型数据的类:
3) 如何在VS Orcas代码编缉器里使用新的LINQ Intellisense支持来得到对查询的完全的Intellisense和编译支持:
4) 如何使用 LINQ到SQL 来创建结合了Product实体数据和从Product实体相关联的OrderDetail实体中计算出来的聚合单元和收入数值的数据报表。这个数据报表使用了服务器端的数据库分页,每次有效率地只获取10行记录(这样,对一个十万行的产品表,不管你的报表指向哪个页,你每次只从数据库获取10行数据):
将来的录像
在将来的录像里,我会对LINQ做一些更深入的探讨,在这个录像里我只是刚触及到表面而已。其他的部分将包含这些内容:
- 类型推断和关键词 var (以及为什么是如此地酷)
- 使用 LINQ到SQL 支持插入,更新和删除操作的情形
- LINQ数据模型里的验证规则和逻辑
- 在 LINQ到SQL 中使用存储过程
- LINQ到SQL 中对JOIN的更丰富的支持
- LINQ到XML 和 LINQ到对象
- 使用新的 LINQDataSource 控件和其他ASP.NET数据控件轻松地创建 Web UI
很明显地,我也将有更多的ASP.NET和与web有关的录像,包括:
- 新的所见即所得(WYSIWYG)的HTML设计器和CSS支持
- 客户端JavaScript Intellisense
- JavaScript调试
- ASP.NET AJAX 扩展器(Extender)支持
- 数据库备份和上传集成
- 单元测试
- 多目标(Multi-targeting)支持(示范如何使用VS Orcas来build ASP.NET 2.0项目,而不用更新你的框架和服务器)
希望本文对你有所帮助,
Scott
附注:如果你有其他题目或主题要我用录像来作详细探讨的话,请把它们贴在这个贴子的评论部分。
数据库的自动安装、升级是一个非常实用的功能,在初次安装软件,升级软件的时候可以节省大量的时间和无趣的工作,而且也节省了给用户写数据库升级指导的说明。
要实现数据库的自动安装、升级,其实并不难。我们在肥猫博客中,提供了这样的功能。每次程序升级,自己用起来都觉得非常地爽,不用繁琐的指导用户,也不用无趣的操作。那么在这里我们就介绍下如何像肥猫博客一样在asp.net中提供这样的功能。
首先,我们要对sql语句非常熟悉,数据库的自动安装和升级都是基于sql脚本的,准备好脚本文件是必须的。
一般来讲,会存在多个脚本文件:
1. 第一次安装所需要的脚本文件
2. 每一次升级所需要的脚本文件。这个升级脚本文件只需要提供从上一版本升级过来所需要的Sql语句就可以,其他的都不需要。
建立一份版本历史文件,这一般可以是一个xml文件,类似如下:
<?xml version="1.0" encoding="utf-8"?>
<sqlscripts>
<sqlscript dbversion="1.1" dspt="V1.0到V1.10的升级包:增加了皮肤的数据" filename="v1_1.sql" />
<sqlscript dbversion="1.11" dspt="V1.10到V1.11的升级包:增加了订阅中最新文章的处理" filename="v1_11.sql" />
<sqlscript dbversion="1.2" dspt="V1.11到V1.20的升级包:增加了垃圾信息、IP管理" filename="v1_2.sql" />
<sqlscript dbversion="1.3" dspt="V1.20到V1.30的升级包:增加了流量统计分析" filename="v1_3.sql" />
<sqlscript dbversion="1.4" dspt="V1.30到V1.40的升级包:增加了我读,我看" filename="v1_4.sql" />
</sqlscripts>
dbversion指的是数据库的版本号,dspt是对应的说明,filename就是上面提到的Sql脚本文件了。我们每次升级程序中的功能时,如果有数据库的升级,都应该增加对应的数据和Sql脚本文件。
另外还要做的准备工作是,要在程序中记录当前程序的版本codeversion,在数据库中记录当前数据库的版本dbversion。需要升级哪些sql脚本,是通过比较这两个版本值决定的。也就是根据codeversion和dbversion的值来确定我们应该执行上面列出的哪些脚本文件。
上面说的都是一些准备工作,下面我们可以开始具体的数据库自动安装、升级的程序开发了。
1. 提供类似如下的界面,告诉用户当前的版本,以及将会进行哪些升级工作。

private void ShowVersion()
{
// 显示当前的程序版本号、数据库版本号
double dbversion = fmPage.Provider.GetDatabaseVersion();
LabelCodeVersion.Text = fmUtility.CodeVersion.ToString("F2");
LabelDbVersion.Text = dbversion.ToString("F2");
XmlDocument doc = new XmlDocument();
// 读取版本历史文件
string filepath = HttpContext.Current.Request.MapPath("/admin/setup/history.xml");
doc.Load(filepath);
TextScripts.Text = string.Empty;
foreach(XmlNode node in doc.DocumentElement.ChildNodes)
{
double nodeversion = double.Parse(node.Attributes["dbversion"].Value);
// 比较数据库版本和程序版本,找出需要更新的列表
if(nodeversion > dbversion && nodeversion <= fmUtility.CodeVersion)
{
TextScripts.Text += "版本号: " + nodeversion.ToString("F2") + "\n";
TextScripts.Text += " " + node.Attributes["dspt"].Value + "\n\n";
}
}
BtnSubmit.Enabled = TextScripts.Text!=string.Empty;
}
2. 执行需要更新的sql脚本
public override void InstallDatabase()
{
double dbversion = GetDatabaseVersion();
XmlDocument doc = new XmlDocument();
string filepath = HttpContext.Current.Request.MapPath("/admin/setup/history.xml");
doc.Load(filepath);
// 使用事务,如果更新不成功则可以回退
OleDbTransaction transaction = connection.BeginTransaction();
try
{
foreach(XmlNode node in doc.DocumentElement.ChildNodes)
{
double nodeversion = double.Parse(node.Attributes["dbversion"].Value);
if(nodeversion > dbversion && nodeversion <= fmUtility.CodeVersion)
{
// 执行更新对应的sql脚本文件
InstallSqlScript(transaction, node.Attributes["filename"].Value);
}
}
transaction.Commit();
}
catch(Exception e1)
{
transaction.Rollback();
throw e1;
}
DataCache.RemoveAll();
}
执行sql脚本文件的代码:
private void InstallSqlScript(OleDbTransaction transaction, string filename)
{
string sql = string.Empty;
using (StreamReader sr = new StreamReader(HttpContext.Current.Request.MapPath("/admin/setup/sqlscripts/access/" + filename)))
{
string line;
while ((line = sr.ReadLine()) != null)
{
// 每当遇到GO标记,则执行该语句
if(line.ToUpper().StartsWith("GO"))
{
AccessHelper.ExecuteNonQuery(transaction, CommandType.Text, sql);
sql = string.Empty;
}
else
{
sql += line + "\n";
}
}
}
}
就这样,数据库的自动安装、升级代码就完成了。这里比较重要的就是sql脚本文件了,sql脚本文件应该要包含所有对数据库的更新内容,否则是达不到预期效果的。
除了以上讲的数据库安装/升级的核心代码外,你可能还需要对该功能进行权限控制。由于我们在肥猫博客中,只有管理员才能够升级,所以没有复杂的权限控制,这里就不介绍了。这部分内容也就交给你自己发挥了。
以上就达到了我们要的效果,我们可以看到,代码并不难,但是可以节省我们在升级时要手工操作的很多时间,而且用户绝对用起来是非常之方便的。
我的同事李浩然写了一份很好的升级文档,详细描述了将SPS2003升级到MOSS2007的步骤,感谢浩然,同意我在我的blog上将此文档共享给大家。请点击下载。
C#代码如下:
private void button2_Click(object sender, System.EventArgs e)
{
System.Threading.Thread thread = new System.Threading.Thread( new System.Threading.ThreadStart(this.ShowOCX2));
thread.SetApartmentState(System.Threading.ApartmentState.STA);
thread.Start();
}
private void ShowOCX2()
{
Form2 form = new Form2();
form.ShowDialog();
}
Form2中是放入了一个ocx(delphi写的一个空ocx,任何自己的代码都没有)。
现在症状是,点击button2之后,出现了form2,直接关闭form2;再次点击button2,程序立刻crash掉。
抓dump(启用了pageheap),发现下面代码:(注意红色的)
Thread 4
Current frame: OCX2Proj1+0x3402
ChildEBP RetAddr Caller,Callee
0513f808 7c9237bf ntdll!ExecuteHandler2+0x26
0513f82c 7c92378b ntdll!ExecuteHandler+0x24, calling ntdll!ExecuteHandler2
0513f850 7c957860 ntdll!RtlDispatchException+0xb1, calling ntdll!RtlpExecuteHandlerForException
0513f874 060e3407 OCX2Proj1+0x3407
0513f880 7c9211a7 ntdll!LdrpCallInitRoutine+0x14
0513f884 7c93e6f4 ntdll!LdrUnloadDll+0x41c, calling ntdll!LdrpCallInitRoutine
0513f888 7c80abf7 kernel32!FreeLibrary+0x3f, calling kernel32!LdrUnloadDll
0513f890 769c3456 ole32!CClassCache::CFinishComposite::Finish+0x1d
0513f894 7c988c37 ntdll!RtlpDphNeedToTrimDelayedFreeQueue+0x3f, calling ntdll!RtlLeaveCriticalSection
0513f8a8 7c98acda ntdll!RtlpDphNormalHeapFree+0xb1, calling ntdll!RtlpDphNeedToTrimDelayedFreeQueue
0513f8bc 7c98770b ntdll!RtlpDebugPageHeapLeaveCritSect+0x10, calling ntdll!RtlLeaveCriticalSection
0513f8c8 7c98af7d ntdll!RtlpDebugPageHeapFree+0x192, calling ntdll!RtlpDebugPageHeapLeaveCritSect
0513f8dc 7c92eafa ntdll!KiUserExceptionDispatcher+0xe, calling ntdll!RtlDispatchException
0513fbdc 060e3402 OCX2Proj1+0x3402 ====> Exception cxr@513f910
0513fb00 7c9306eb ntdll!RtlAllocateHeap+0xeac, calling ntdll!_SEH_epilog
0513fc70 7c9211a7 ntdll!LdrpCallInitRoutine+0x14
0513fc90 7c93e6f4 ntdll!LdrUnloadDll+0x41c, calling ntdll!LdrpCallInitRoutine
0513fcf4 7c939213 ntdll!LdrShutdownThread+0xd7, calling ntdll!LdrpCallInitRoutine
0513fcf8 7c80c096 kernel32!ExitThread+0x3e, calling kernel32!LdrShutdownThread
0513fd70 77d193e9 user32!NtUserPeekMessage+0xc
然后切换进去
0:004> .cxr 513f910
eax=f0f0f0f0 ebx=0000000f ecx=00000000 edx=f0f0f001 esi=06146590 edi=06149638
eip=060e3402 esp=0513fbdc ebp=0513fbf0 iopl=0 nv up ei ng nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010286
OCX2Proj1+0x3402:
060e3402 8b08 mov ecx,dword ptr [eax] ds:0023:f0f0f0f0=????????
0:004> kb
*** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr Args to Child
WARNING: Stack unwind information not available. Following frames may be wrong.
0513fbf0 060e3f10 0513fc64 060e3cff 0513fc10 OCX2Proj1+0x3402
0513fc10 060e4246 0513fc70 0513fc60 06149664 OCX2Proj1+0x3f10
0513fc70 7c9211a7 060e0000 00000000 00000000 OCX2Proj1+0x4246
0513fc90 7c93e6f4 061467b0 060e0000 00000000 ntdll!LdrpCallInitRoutine+0x14
0513fd88 7c80abf7 060e0000 0513fdd0 0513fdf4 ntdll!LdrUnloadDll+0x41c
0513fd9c 769c3442 060e0000 0513fe18 769c3456 kernel32!FreeLibrary+0x3f
0513fda8 769c3456 0513fddc 76ab67e0 00000000 ole32!CClassCache::CDllPathEntry::CFinishObject::Finish+0x2f
0513fdbc 769b2557 76991ab0 00000000 00000000 ole32!CClassCache::CFinishComposite::Finish+0x1d
0513fe18 769b2243 0133d878 00000080 00000001 ole32!CClassCache::CleanUpDllsForApartment+0x1b5
0513fe44 769b2171 00000000 0513fe90 76ab67e8 ole32!FinishShutdown+0xcd
0513fe60 769af221 00000000 00000000 0133d878 ole32!ApartmentUninitialize+0x7e
0513fe78 769aee88 0513fe90 00000000 00000001 ole32!wCoUninitialize+0x41
0513fe94 769c31f0 76990000 769ad1a2 0513fec4 ole32!CoUninitialize+0x5b
0513fe9c 769ad1a2 0513fec4 769ad141 76990000 ole32!DoThreadSpecificCleanup+0x47
0513fea4 769ad141 76990000 00000003 00000000 ole32!ThreadNotification+0x37
0513fec4 769ad0e9 76990000 00000003 00000000 ole32!DllMain+0x147
0513fee4 7c9211a7 76990000 00000003 00000000 ole32!_DllMainCRTStartup+0x52
0513ff04 7c939213 769ad0a1 76990000 00000003 ntdll!LdrpCallInitRoutine+0x14
0513ff7c 7c80c096 00000000 00000000 01321d40 ntdll!LdrShutdownThread+0xd7
0513ffb4 7c80b688 00000000 00000000 00000000 kernel32!ExitThread+0x3e
最上面三行就是delphi写的那个空白ocx,下面三个是各自的代码:
0:004> u OCX2Proj1+0x4246
OCX2Proj1+0x4246:
060e4246 ?? ???
^ Memory access error in 'u OCX2Proj1+0x4246'
0:004> u OCX2Proj1+0x3f10
OCX2Proj1+0x3f10:
060e3f10 ?? ???
^ Memory access error in 'u OCX2Proj1+0x3f10'
0:004> u OCX2Proj1+0x3402
OCX2Proj1+0x3402:
060e3402 8b08 mov ecx,dword ptr [eax]
060e3404 ff51fc call dword ptr [ecx-4]
060e3407 c3 ret
060e3408 53 push ebx
060e3409 56 push esi
060e340a 57 push edi
060e340b 89c3 mov ebx,eax
060e340d 89d7 mov edi,edx
0:004> d [ecx-4]
fffffffc ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
0000000c ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
0000001c ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
0000002c ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
0000003c ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
0000004c ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
0000005c ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
0000006c ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ????????????????
郁闷之极,好像用VB写一个空OCX放到form上,然后thread调用起来,也有这个问题。哪位老大见过这个问题?貌似和Appartment有关?
【原文地址】My Upcoming Presentations in Belgium, London, and Orlando
【原文发表日期】 Wednesday, January 24, 2007 11:43 PM
我只想就以后几个星期内我将做的讲座日程做一个简短的更新:
布鲁塞尔(比利时): 我将于2月1日(下星期四)在比利时做2个讲座,一个是First Look at Visual Studio and ASP.NET 'Orcas',另一个是ASP.NET 2.0 and ASP.NET AJAX Tips and Tricks。你可以免费参加这项活动。这里有更多详情。
里丁(英国): 我将于2月3日(星期六)在里丁的微软校园举行的WebDD 大会上做4个讲座,第一个是First Look at Visual Studio and ASP.NET 'Orcas',第二个是Building an end-to-end application using IIS7,第三个是ASP.NET 2.0, ASP.NET AJAX and VS 2005 Part 1 and 2,最后一个是First Look at WPF/E。
奥兰多(佛罗里达): 我将于3月25日至28日在奥兰多举行的ASP.NET Connections大会上做主体演讲和几个分会场讲座。如果你没参加过ASP.NET Connections大会的话,我强烈建议你参加。该大会地点理想,将举办40多个讲座,都是由出色的主讲人做的。你可以在这里了解更多详情。
希望在这些活动中看到你们中的一些人!
Scott
做个广告:重出江湖的ZDNet中文社区将在2月4日下午两点在北京银网中心举行Office技术沙龙系列讲座的第一讲,我和Kaneboy也会参加这次活动,与其他参会者分享2007 Office System的相关知识。
点击这里免费在线报名注册!!
还等什么??

活动时间:2007年2月4日(星期日)下午14点
活动地点:CNET(中国)总部(海淀区知春路113号银网中心A座9层,大海会议室)
活动讲师:陈曦(微软MVP,SharePoint资深专家)
嘉宾讲师:涂曙光(微软中国有限公司专业解决方案部技术专家)
参加讲座的网友将获得精美纪念品,现场还将设有有奖互动的环节,惊喜等你来。

【原文地址】 ASP.NET AJAX 1.0 Released
【原文发表日期】 Tuesday, January 23, 2007 10:52 AM
我非常兴奋地宣布,ASP.NET AJAX 1.0(即Atlas)的最终版已于今天早晨发布了,你可以在这里下载。
ASP.NET AJAX 1.0
ASP.NET AJAX 1.0提供了一个丰富的客户端AJAX库,该库对核心JavaScript类型系统,基于JSON的网络层,JavaScript 组件/控件模型,以及常用的客户端JavaScript辅助类等提供了跨平台,跨浏览器支持。ASP.NET AJAX同时也提供了一个丰富的服务器端的库,把AJAX功能与ASP.NET集成,允许开发人员以最小的努力在现有的ASP.NET 2.0网站中轻松地启用AJAX。
ASP.NET AJAX是免费的,可以在ASP.NET 2.0和VS 2005使用,它是个完全支持的微软产品,受标准的10年微软支持许可的支持,即,一周七天,每天24小时都可以通过电话从微软产品支持(Microsoft Product Support)处获得支持的。
ASP.NET AJAX 控件工具包
除了完全支持的ASP.NET AJAX 1.0产品外,你还可以使用ASP.NET AJAX 控件工具包中的30多个免费的ASP.NET AJAX控件。这个控件工具包是个共享源码的协作性项目,是由一支由微软和非微软开发人员组成的队伍共同开发的 (访问CodePlex 项目网站以了解详情,或者志愿参与)。控件的所有源码都是完全免费的,同时赋予你完全的重用和修改的权利。
工具包中的大部分控件利用了核心ASP.NET AJAX库中引进的Control Extender(控件扩展器)模式,它提供了一个超强的方式来以最小的努力即可在网站上轻松地启用某些特定的AJAX 场景。
譬如,考虑这样一个场景,你想往一个网页上添加一个很酷的AJAX日历控件(注意,下面这个浏览器是Opera):
想用ASP.NET AJAX 控件工具包实现的话,你只要在网页上加一个 <ajaxToolkit:CalendarExtender> 控件,将它指向一个用来储存日期的文本框即可(不需要额外的代码):
<asp:TextBox ID="DateTextBox" runat="server" />
<ajaxToolkit:CalendarExtender ID="Calendar1" runat="server" TargetControlID="DateTextBox" />
ASP.NET AJAX 控件工具包在以后的日子里将会继续扩充,每个月都会有更多的控件,功能以及缺陷修补添加进来。今天发布的ASP.NET AJAX 控件工具包新版本添加了对4个新控件的支持: <ajaxToolkit:CalendarExtender> , <ajaxToolkit:MaskedEditExtender> , <ajaxToolkit:TabContainer> , 和 <ajaxToolkit:AutoCompleteExtender>。你可以在这里试用这些控件的在线样例。
(特别感谢 Ron 和 Fernando 开发完成本月添加进来的Calendar, Tab和 MaskedEdit新控件。)
ASP.NET AJAX 1.0 源码发布
除了发布ASP.NET AJAX 控件工具包中的控件的源码外,我们也将公布完全支持的ASP.NET AJAX 1.0 产品的全部源码。具体说来:
我们将在Microsoft Permissive License (Ms-PL)许可下公布客户端ASP.NET AJAX JavaScript库(我们也称之为“微软AJAX库(Microsoft AJAX Library)”)。这个许可授予开发人员这样的权利,可以自由地定制/修改这个库,以及在商业或非商业用途下重新发布这个JavaScript 库的衍生版本。
为帮助调试和开发,我们也将在Microsoft Reference License (Ms-RL)许可下公布服务器端ASP.NET AJAX 1.0实现的全部编码(包括UpdatePanel,UpdateProgress, ScriptManager和网络持久层(Network Serialization)的代码)。
ASP.NET AJAX 发布候选版(RC)和RTM版间的变动
在ASP.NET AJAX 发布候选版(RC)和RTM版间,我们做了不少改进和缺陷修补,这些变动包括:
- 在共享主机场景下对性能和扩缩性的改进
- 对ScriptManager 和ScriptResource 处理器做了Globalization方面的修补以支持日期/数字分析和UI文化的fallback
- 更新了ScriptResource处理器以根据浏览器类型支持自动启动或禁止JavaScript压缩
- 支持替换缓存以允许更多的局部更新的场景
- 额外的缺陷修补以及总的健壮性方面的改进
你可以在http://ajax.asp.net网站上找到讨论所有变动的更完整的文档。
如果你在你的系统上安装过ASP.NET AJAX以前的版本的话,我建议你删除VS用来提供HTML视图Intellisense的控件标识的VS schema缓存文件。这将确保你的HTML源码编辑器对ASP.NET AJAX控件提供的Intellisense是正确的,而且不会搞混,否则的话,它也许会仍旧使用以前Beta2版里的值以至出错。
- 在Windows XP中,你要删除 c:\Document and Settings\[YourUserName]\Application Data\Microsoft\VisualStudio\8.0\ReflectedSchemas 这个文件夹中的所有文件。
- 在Windows Vista中,你要删除 c:\Users\[YourUserName]\AppData\Roaming\Microsoft\VisualStudio\8.0\ReflectedSchemas 这个文件夹中的所有文件。
将来计划
虽然核心ASP.NET AJAX 1.0产品才正式推出,但我们绝对没有放慢速度
。
ASP.NET AJAX 1.0中所有的功能都将直接集成到ASP.NET的下一个版本(代号为Orcas)中去。Visual Studio "Orcas"也将提供客户端 JavaScript Intellisense,JavaScript 编译检查,以及对ASP.NET AJAX使用场景的丰富的JavaScript 调试支持。
同时,我们已经开始ASP.NET AJAX下一个版本的工作,并将继续往支持的ASP.NET AJAX核心里添加新的功能和做诸多改进。你已经可以开始使用ASP.NET AJAX Futures CTP里的众多新功能,你可以在ASP.NET AJAX网站下载这个CTP,它支持“go live” 许可。
结语
ASP.NET AJAX 1.0终于发布了,对此我们非常兴奋。它将极大地简化向ASP.NET 2.0应用里添加丰富的AJAX 功能,势将显著改进消费者的用户体验。我们热切期待看到你们用它来打造的所有的精妙应用!
谢谢,
Scott
Digital Certificate是计算机安全里很常见的内容。在网络上,最常见的情况大概就是SSL安全连接中的使用了。关于Digital Certificate,RSA算法,DSA算法,Message Digest,Mutual SSL等内容我就不介绍了,需要用到的朋友应该都很熟悉。如果不是很熟悉但有兴趣了解一些,这里有一个很浅显的教程:
http://www.youdzone.com/signature.html
这里简单介绍一点我自己遇到过的一些小例子。
我们的项目里需要用到一些Certificate(抱歉,我想还是不翻译成“证书”了,下同),有各种不同的用处,比如有用来做mutual SSL的,有用来做数字签名(digital signature)的。Windows提供了一个管理你系统里所有Certificate的工具,你可以这样调用:
1. Start -> Run -> "mmc"
2. 然后在出来的工具界面中-> File -> Add/Remove Snap-in -> Add -> Certificates -> 选Computer Account
这样就可以看到所有安装在LocalMachine这个Certificate Store里的Certificates了。如果在最后一步选My user account,则是看到CurrentUser这个Certificate Store。
开始的时候我们的Certificate全是通过这个工具来手工管理的,但后来Certificate越来越多,且每个Certificate的权限设置都有不同的时候,我们发现手工管理很容易出错,而且在最后布置(deploy)Web Application的时候很不方便(需要手动地往服务器上一个个加Certificate),所以我就写了一个工具来自动化整个过程。
.NET 2.0中对Ceritificate以及Certificate Store的使用和管理提供了很多的类,请参看System.Security.Cryptography.X509Certificates这个命名空间。两个最常用的类是:
X509Store (代表Certificate Store)和X509Certificate2 (代表X509标准的Certificates)
每个Certificate Store都有一串sub store,比如Personal是存放一些你个人的Certificate的地方(你如果给你的IIS服务器用selfssl加了一个服务器Certificate,那个Certificate就存放在Personal sub store里),还有比如Trusted Root Certification Authorities是存放所有你信任的Root Certificate的地方。
现在假设我们有一个很简单的任务,就是要在LocalMachine Certificate Store里建立一个MyProjectCerts的sub store,然后把我们项目用到的Certificate全放在那里,这个在.NET很容易做(如果是用传统的Win32 CAPI的话,光看看那些有5,6个参数的API就够你头疼的了):
X509Store store = new X509Store(args[1], StoreLocation.LocationMachine);
store.Open(OpenFlags.ReadWrite);
X509Certificate2 certificate = new X509Certificate2(PATH_TO_CERTIFICATE);
store.Add(certificate);
store.Close();
如果你的certificate带有一个Private Key(关于Certificate及其携带的Public Key/Private Key的内容我也略过了)的pfx文件,那么它一定是有密码保护的,不过这也很容易,只要在构造函数里多加一个参数就可以了:
X509Certificate2 certificate = new X509Certificate2(PATH_TO_CERTIFICATE, PASSWORD);
最后一部分是给Certificate分配合理的权限,其中最重要的,就是那些帐号(user account)有权限可以拿到一个Certificate的Private Key。这个很关键,因为Private Key是证明你是这个Certificate拥有者的最终证据,有了Private Key,你就可以生成签名,给消息加密,等等。
可是在这个过程中,原来很简单的问题却有了点波折。
首先我们发现我们的一些功能函数在Visual Studio的unit test环境中工作正常,但当这些函数被Web App的功能模块调用的时候,测试就通不过了。后来我们意识到是权限的问题,在unit test中直接调用那些函数的帐号是system admin,而安装Certificate也是system admin,所以测试程序可以顺利拿到Private Key来完成工作。但当这些函数被Web App调用的时候,执行的帐号变成了ASPNET,而ASPNET没有取得Private Key的权限!
于是我们用的是Windows Server 2003 Resource Kit里的winhttpcertcfg这个工具给ASPNET分配必要的权限,可是这样还有问题。
原本我们是在mmc这个工具里手工加入了Certificate,然后再用winhttpcertcfg分配权限,一切正常。但当我们用我的工具来加入Certificate后,winhttpcertcfg就无法正常设置权限了,硬是说我不是这个certificate的installer。见鬼,我不是刚刚才用我的工具往Certificate Store加了Certifiicate么,然后再马上接着用winhttpcertcfg的,怎么5秒钟的功夫我就变成不是原来的installer了。找了半天也不知什么原因,我甚至把winhttpcertcfg反编译了看它调用了那些CAPI (Cryptography API的简称),还是不懂。
后来才在这里找到了一片文章才恍然:http://blogs.msdn.com/ploeh/archive/2006/12/20/IntegrationTestingWithCertificates.aspx
原来缺省情况下创建一个X509Certificate2对象:X509Certificate2 certificate = new X509Certificate2(PATH_TO_CERTIFICATE); 的时候,Certificate的Private Key是不会被Persist(抱歉,不知该怎么翻译,不过大家对Persistance这个概念总是知道的吧?差不多的意思)到Certificate Store里,一定要调用第三个构造函数:
X509Certificate2 certificate = new X509Certificate2(PATH_TO_CERTIFICATE, PASSWORD, X509KeyStorageFlags.PersistKeySet);
这样做了以后,guess what? 还是不行,呵呵。继续研究一下,才发现,缺省情况下,Private Key是Persist到CurrentUser这个Store里的,而我们的Certificate安装在LocalMachine这个Store里(其实如果你在mmc中同时显示CurrentUser和LocalMachine两个Store,你会发现它们之间有一种奇妙的镜像关系,就是你加到LocalMachine里的Certificate会自动出现在CurrentUser那边,这个现象其实也给我们造成了麻烦,这里我就不展开了)。
最后的正确答案:
X509Certificate2 certificate = new X509Certificate2(PATH_TO_CERTIFICATE, PASSWORD, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);
WSS V3 和MOSS的SDK的正式版终于发布了,下载地址我不重新贴了,这里有:
WSS 3.0 SDK 与 MOSS 2007 SDK 正式版终于发布出来了 (Kaneboy's Blog)
抢先看一下正式版的SDK都包含了哪些新的内容:
总体来说SDK的内容完全充实了,之前很多页面都只有标题。
1)WSS V3 SDK
让我感到很激动的是,用VS开发自定义工作流的Sample,利用ASPX页面作为工作流交互的页面的例子ASPXCollectFeedback。这正是长久以来,我们希望看到的例子!
还包括工作流开发的VS模板以及一个文档WorkflowVSProjectTemplatesReadme.doc。
2)MOSS SDK
里面包括了WSS V3 SDk,OSSSDK2007和示例代码,Form Services SDK和ECM Starter Kit(企业内容管理)。
MOSS SDK包含的示例代码:
1、SSO示例
2、BusinessDataCatalogMetadataSamples:BDC示例
3、WebPartFiltersAndConsumers:过滤器WebPark示例
ECM Starter Kit中包含的是企业内容管理相关的白皮书和示例工程:
白皮书包括了:
1、如何使用和配置IRM功能
2、WorkflowSecurityTopics
3、如何在SharePointDesigner中导入Custom Actions
4、Office文档数字签名和RMS加密
示例工程:
主要包括了工作流方面,文档转换(Document Convertor),记录管理(Record Management)三个方面的内容
总体来说,很多的解答了我们最近关注的问题,比如SSO,工作流,CustomActions,IRM,记录管理,BDC等。
这个SDK的新信息很多,赶紧下载......
如果你的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
));
}
return sb.ToString();
}
附参考的matchineKey配置:
<?xml version="1.0"?>
<configuration>
<system.web>
<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>
</system.web>
</configuration>
【原文地址】 Visual Studio "Orcas" Web Designer Integrated into Main
【原文发表日期】 Monday, January 22, 2007 7:37 AM
这个周末对VS Web工具开发组来说是个非常激动人心的日子。星期六,他们把新的HTML和ASP.NET “所见即所得”(WYSIWYG)设计器的代码提交进(checked in) Visual Studio 主体里了。这个设计器,与Visual Studio以前的HTML设计器相比,是一个非常重大的改进,而且以后将是Visual Studio和Expression Web设计器两者共同使用的组件。
此外,新的HTML设计器将提供:
- 分割界面(Split View)的支持 (同时将HTML源码和所见即所得设计模式打开的能力)
- 无比丰富的CSS支持 (CSS属性窗口,CSS继承图示器,CSS预览,以及CSS管理器)
- 极大改进的视图转换性能 (从源码模式转换成HTML设计模式将会瞬时完成)
- 对源码视图内控件设计器的支持 (属性构造器,事件接通(wire-up)以及向导将会在源码视图内正常工作)
- 更丰富的标尺(ruler)和布局支持 (更棒的是,它们的值将自动储存在外部的CSS文件中)
- 对内嵌母板页的设计器支持
下面是一张示范多个新功能的屏幕截图:
我们其实早在2004年11月,即,几乎是在VS 2005发布之前一年,就开始打造新的设计器了,因为要做的太多。Mikhail Arkhipov是主持和设计该项工作架构的开发主管。你可以在他这里的博客帖子里进一步了解该项目的情况以及查看新设计器的一些初期屏幕截图。
我计划在下几个星期内录制一些录像,展示新的HTML设计器以及Orcas的其他一些既新又酷的功能。下一个Orcas CTP将包括这个新的设计器以及成堆的其他新功能,让你自己尝试一下。
希望你喜欢,
Scott
More Posts
Next page »