﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Burnett</title><link>http://www.cnblogs.com/burnett/</link><description>淡定,执着......</description><language>zh-cn</language><lastBuildDate>Thu, 28 Aug 2008 13:11:24 GMT</lastBuildDate><pubDate>Thu, 28 Aug 2008 13:11:24 GMT</pubDate><ttl>60</ttl><item><title>【招聘.NET开发人员】待遇从优</title><link>http://www.cnblogs.com/burnett/archive/2008/03/11/1100665.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Tue, 11 Mar 2008 07:52:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2008/03/11/1100665.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/1100665.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2008/03/11/1100665.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/1100665.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/1100665.html</trackback:ping><description><![CDATA[招聘职位:.NET开发工程师<br />
<br />
工作地点:南京<br />
<br />
主要职责:<br />
1、完成对企业的需求分析及详细的规划设计<br />
2、以Sharepoint为中心的企业级应用软件开发、部署、维护<br />
3、整合异构的应用系统<br />
<br />
<br />
任职要求:<br />
1、有良好的沟通能力和团队合作能力； <br />
<br />
2、熟悉Windows域控制原理，熟悉AD，了解IIS的使用和管理；<br />
&nbsp;<br />
3、熟悉C++、&nbsp; ASP.Net 1.1/2.0、XML、工作流的开发，有参与过相关Web应用开发经验优先；<br />
<br />
4、了解Microsoft SQL Server 2000/2005的安装和使用； <br />
<br />
5、熟悉Sharepoint环境优先<br />
<br />
<br />
职业规划:<br />
MS应用专家<br />
Sharepoint应用专家<br />
职业IT管理者<br />
<br />
请感兴趣者发送简历至:liu.bo22@zte.com.cn<br />
<img src ="http://www.cnblogs.com/burnett/aggbug/1100665.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41940/" target="_blank">[新闻]惠普139亿美元完成对EDS的收购</a>]]></description></item><item><title>【剖析MOSS系列之一】万能的AllUserData</title><link>http://www.cnblogs.com/burnett/archive/2008/02/24/1079781.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Sun, 24 Feb 2008 13:50:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2008/02/24/1079781.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/1079781.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2008/02/24/1079781.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/1079781.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/1079781.html</trackback:ping><description><![CDATA[<p><br />
大家都知道，Sharepoint的列表实际上是对数据库中表(Table)的概念的延伸。但是当我们打开Sharepoint的时候，会发现，你建立的列表并没有存储成数据库中的一张表。那么列表是存储在哪里的呢？他们在运行中又是怎么被提取出来的呢？从这篇文章开始，我们要一点一点将MOSS的神秘的存储结构剖析清楚，不仅仅对MOSS的开发有帮助，也可以拓宽我们的软件体系设计的思维。</p>
<p>&nbsp; 打开SqlServer 中对应的数据库，我们会发现有很多很多的表存在，其中最为重要的当属dbo.AllUserData表。里边存储了基本上所有的数据。当然，你存储在列表中的数据也是存储在这里的。<br />
&nbsp; 打开这个表，你会发现有很多的列。在后边就会知道这些列都是用来做什么的。<br />
<img alt="" src="http://www.windwhisper.cn/attachments/month_0802/g2008218153747.jpg" />&nbsp; <img alt="" src="http://www.windwhisper.cn/attachments/month_0802/b2008218155835.jpg" /></p>
<p>&nbsp;&nbsp; 其实，MOSS的列表概念可以理解成一张虚表，它并不是真实存在的，而是在需要的时候，从AllUserData中动态的提取出来，不过AllUserData存储的是所有的数据，像被丢在回收站的数据也是在里边被保留下来的，只不过被做了一个特殊的标记。</p>
<p><img alt="" src="http://www.windwhisper.cn/attachments/month_0802/z200821816140.jpg" /></p>
<p>聪明的读者一定发现了，AllUserData中的tp_ListId就是确定不同的&#8220;虚表&#8221;的，如果写成sql查询，应该类似于这样</p>
<div class="codeText">
<div class="codeHead">SQL代码</div>
<ol class="dp-sql">
    <li class="alt"><span><span class="keyword">select</span><span>&nbsp;*&nbsp;</span><span class="keyword">from</span><span>&nbsp;dbo.AllUserData&nbsp;</span><span class="keyword">where</span><span>&nbsp;tp_ListId=</span><span class="string">'your&nbsp;list&nbsp;id'</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>是的，这样就可以简单的将自己需要的数据单独提取出来了。不过这只是第一步。最重要的是，列表中的列，在AllUserData中怎么表示呢？反正不能新建一个列，就改动AllUserData的结构吧。并且怎么处理不同列的相同列名的情况呢（比如内容类型）？聪明的MS开发者使用的是这么一种办法。在AllUserData表中，预先留置了很多很多的，多到你用不完的数据列，这些列的列名就是他们的类型+编号。比如nvarchar1,nvarchar2,float1,int3,datatime1......在MOSS中创建栏的时候，MOSS根据栏的类型，就会将数据存储到相应的这些数据列中。比如用户姓名会存入nvarchar1中，而年龄也许会存入int1中，这些存储不是随机的，而是采用的先到先服务(FIFS)的思想的。并且这些列与列名的映射都会存入dbo.AllLists表中的tp_Fields属性中。你可以在这个属性中看到映射。如果你稍微处理一下，这个属性中的数据可以按照XML文件来处理(后边会给出代码)。</p>
<p>好了，这个就是MOSS数据库的结构。有人会问，既然MOSS给了这么好用的List的概念，为什么还用煞费苦心的自己来读取数据呢？我想首先一个是更加了解MOSS体系结构，另外一个绕过了MOSS的一些体系上的效率问题，直接存取数据库的效率和灵活性，sql查询的强大，列表和列表自带的CAML查询应该是做不到的。</p>
<br />
文章来源:<a href="http://www.windwhisper.cn/default.asp?id=32">http://www.windwhisper.cn/default.asp?id=32</a> 
<img src ="http://www.cnblogs.com/burnett/aggbug/1079781.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41939/" target="_blank">[新闻]搜狗五笔输入法发布</a>]]></description></item><item><title>MOSS 2007 SP1的一些补丁说明</title><link>http://www.cnblogs.com/burnett/archive/2007/12/14/995147.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Fri, 14 Dec 2007 08:26:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/12/14/995147.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/995147.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/12/14/995147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/995147.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/995147.html</trackback:ping><description><![CDATA[&nbsp; MOSS 2007经过近一年的使用体验，终于在2007年底的时候放出了SP1，可谓是千呼万唤始出来。<br />
<br />
<span style="font-weight: bold;">不但让MOSS2007支持了AJAX的web part，而且更新了STSADM的工具。<br />
<br />
</span>
其中有几个比较重要的HotFixes：<br />
You configure an advanced search Web part to use a custom scope. However, when you perform the advance search operation, the result that you obtain is not limited to the custom scope.<br />
搜索Web部件并不会限定在特定的站点内部。<br />
<br />
When you use Forms-based authentication, no search results are returned. However, when you use NTLM authentication, search results are returned.<br />
Form认证的时候，不会返回搜索结果。<br />
<br />
In Firefox 2.0, any author-time action does not finish when that action involves a SharePoint Server 2007 dialog box that lets you perform the following actions: &#8226; Edit the HTML source code of a given HTML field&nbsp; <br />
&#8226; Select assets such as an image or a link&nbsp; <br />
&#8226; Perform a state action, such as "check-in," "submit for approval," or "approval"&nbsp; <br />
This issue also occurs when any Microsoft Windows SharePoint Services or SharePoint Server 2007 dialog box passes non-string values back to the caller.<br />
这个fix是针对Firefox的，看来微软真是下了血本了：D<br />
<br />
You install Windows SharePoint Services 3.0 and then upgrade to SharePoint Server 2007. Then, you uninstall SharePoint 2007. When you try to reinstall SharePoint 2007, the installation fails. Additionally, you receive the following error message: <br />
Error 997 <br />
当你从WSS3.0升级到MOSS2007，然后你删掉MOSS2007，在安装的时候，会出现997错误。<br />
<br />
大部分是对从wss2.0升级带来的问题，搜索爬网的问题，多语言的问题，字符大小写问题，还有对Windows Server 2008的兼容等作出的补丁。其他的小问题，可以参看这两个文件。<br />
<br />
<span style="font-weight: bold;"><a href="http://www.windwhisper.cn/javascript:void(0);/*1197618937640*/">WSS 3.0 SP1 HOTFIXES</a><br />
</span><br />
<span style="font-weight: bold;"><a href="http://download.microsoft.com/download/B/C/F/BCFBEC81-ED9E-40A3-BBF0-1410B67A365A/2007%20Office%20Servers%20Service%20Pack%201%20Changes_all.xls">OSS SP1 HOTFIXES</a><br />
<br />
PS：如果在使用MOSS之前就知道了这些BUG，不知道当时心里会怎么想：D</span><br />
文章来源:<a href="http://www.windwhisper.cn/default.asp?id=16">http://www.windwhisper.cn/default.asp?id=16</a>
<img src ="http://www.cnblogs.com/burnett/aggbug/995147.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41938/" target="_blank">[新闻]新学年开始 大学生适用的十大互联网应用</a>]]></description></item><item><title>欢迎大家访问我的新Blog</title><link>http://www.cnblogs.com/burnett/archive/2007/12/11/990192.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Tue, 11 Dec 2007 01:05:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/12/11/990192.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/990192.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/12/11/990192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/990192.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/990192.html</trackback:ping><description><![CDATA[<a title="http://www.windwhisper.cn" href="http://www.windwhisper.cn">http://www.windwhisper.cn</a><br />
同时，园子里的文章也会跟着这个Blog同步更新的。<br />
<img src ="http://www.cnblogs.com/burnett/aggbug/990192.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41937/" target="_blank">[新闻]Google拟在9月发布自有浏览器 或采用火狐内核</a>]]></description></item><item><title>Form认证的AD升级之道</title><link>http://www.cnblogs.com/burnett/archive/2007/12/10/989831.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Mon, 10 Dec 2007 11:56:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/12/10/989831.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/989831.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/12/10/989831.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/989831.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/989831.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;因为老大的要求，需要将MOSS的Window认证改为较为友好的Form认证。因为这是一个很老的话题，所以懒得自己想，上网google了一下。这一下不要紧，发现网络上的教程，所用的数据源要不是text的，要不就是sql server上的，唯独没有AD的。看来还是要自己动手哇。<br />
&nbsp;&nbsp;OK，让我们先了解一下升级的大致原理。<br />
&nbsp;&nbsp;<img alt="" src="http://www.windwhisper.cn/attachments/month_0712/02007121019141.jpg" border="0" /><br />
&nbsp;&nbsp;这是Memebership在整个应用结构中的位置。观察发现，Membership的位置位于较为底层，可以预见的是，很多具体的应用操作可以通过Membership实现过滤。<br />
&nbsp;&nbsp;因为我们是使用的现成的AD组件，所以我们并不需要写什么代码，直接对web.config文件做一些修改即可，告诉MOSS该将取得的用户名与密码送到哪里去，然后获得一个布尔型的结果，既可以达到以前windows认证相同的效果了。<br />
&nbsp;&nbsp;在这里，我们假设，你要对<a href="http://moss:8082" target="_blank">http://moss:8082</a>站点进行form认证的升级。<br />
&nbsp;&nbsp;注意，请在修改web.config文件之前做一下备份！<br />
<div align="center">一，修改8082文件夹下的web.config文件</div>
<br />
打开此文件，定位到&lt;system.web&gt;节点下，增加此节点<br />
<div class="UBBPanel">
<div class="UBBTitle"><img style="margin: 0px 2px -3px 0px;" alt="程序代码" src="http://www.windwhisper.cn/images/code.gif" /> 程序代码</div>
<div class="UBBContent">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">membership&nbsp;</span><span style="color: #ff0000;">defaultProvider</span><span style="color: #0000ff;">="MembershipADProvider"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">providers</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="MembershipADProvider"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff;">="System.Web.Security.ActiveDirectoryMembershipProvider,&nbsp;System.Web,Version=2.0.0.0,&nbsp;Culture=neutral,&nbsp;PublicKeyToken=b03f5f7f11d50a3a"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionStringName</span><span style="color: #0000ff;">="ADConnectionString"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionUsername</span><span style="color: #0000ff;">="administrator"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionPassword</span><span style="color: #0000ff;">="your&nbsp;password"</span><span style="color: #ff0000;">&nbsp;attributeMapUsername</span><span style="color: #0000ff;">="SAMAccountName"</span><span style="color: #ff0000;">&nbsp;enableSearchMethods</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">providers</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">membership</span><span style="color: #0000ff;">&gt;</span></div>
</div>
</div>
<br />
并且在&lt;system.web&gt;的父级节点增加此节点<br />
<div class="UBBPanel">
<div class="UBBTitle"><img style="margin: 0px 2px -3px 0px;" alt="程序代码" src="http://www.windwhisper.cn/images/code.gif" /> 程序代码</div>
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">connectionStrings</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">add&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="ADConnectionString"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionString</span><span style="color: #0000ff;">="LDAP://yourcompany.com/CN=Users,DC=YOURCOMPANY,DC=com"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">connectionStrings</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
</div>
<br />
<div align="center">二，修改管理中心的web.config文件</div>
<br />
打开IIS，打开管理中心站点的属性查看管理中心的文件目录<br />
<img alt="" src="http://www.windwhisper.cn/attachments/month_0712/j20071210193212.jpg" border="0" /><br />
进入文件目录，按照步骤一的改法再次修改一遍web.config。<br />
<strong>
这里要注意的几个问题:</strong><br />
一个就是attributeMapUsername属性，必须赋上SAMAccountName（注意大小写），否则会在添加用户的时候出现"找不到完全匹配的项目"的错误。如下图<br />
<img alt="" src="http://www.windwhisper.cn/attachments/month_0712/u20071210193735.jpg" border="0" /><br />
<br />
另外一个问题就是关于LDAP配置，你需要根据你自己域树的形状设定LDAP地址。<br />
最后一个是关于设定应用程序和管理中心的web.config文件。为什么非要修改管理中心的web.config文件呢？管理中心中有时候必须要到域里取用户的信息，比如设定站点集的管理员。如果你还是用的域里的信息，那么会生成类似于下面这种形式的登录名:YOURDOMAIN\YOURNAME,而你用的Form认证，会生成YOURPROVIDERNAME/YOURNAME格式的登录名。显然，这两种登录名是不一样的。这也是为什么在更换到Form认证以后，所有的角色会失效的原因。<br />
<br />
<br />
<div align="center">三，管理中心中配置</div>
<br />
好了，现在web.config文件设定完毕了。<br />
进入管理中心-》应用程序管理-》应用程序安全性 -》验证提供程序 。选择8082端口的应用程序。<br />
<img alt="" src="http://www.windwhisper.cn/attachments/month_0712/h2007121019411.jpg" border="0" /><br />
然后按照你设定的Provider名称填入。<br />
<img alt="" src="http://www.windwhisper.cn/attachments/month_0712/v2007121019432.jpg" border="0" /><br />
<br />
<strong>&nbsp;&nbsp;
注意：此时数据虽然还是AD中的，但是因为映射改变，角色也就失效了，要在&#8220;网站集管理员&#8221;中重新设定管理员，并且你的站点里也要重新分配员工到角色上，并且一个可爱的功能没了（添加所有已验证用户）。</strong><br />
<img alt="" src="http://www.windwhisper.cn/attachments/month_0712/j20071210195011.jpg" border="0" /><br />
<br />
<br />
大功告成，现在登陆看看，记得，此时只要用户名就可以了，域名就不要填了：）<br />
<br />
<br />
文章来源:<a href="http://www.windwhisper.cn/default.asp?id=14">http://www.windwhisper.cn/default.asp?id=14</a> [来自于我的www.windwhisper.cn，文章总是会现在这里发布的。]

<img src ="http://www.cnblogs.com/burnett/aggbug/989831.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41936/" target="_blank">[新闻]微软正在构思将Wi-Fi带入汽车</a>]]></description></item><item><title>谁动了我的Infopath附件？－Infopath上传文件产生“文件损坏”</title><link>http://www.cnblogs.com/burnett/archive/2007/10/17/927712.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Wed, 17 Oct 2007 09:23:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/10/17/927712.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/927712.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/10/17/927712.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/927712.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/927712.html</trackback:ping><description><![CDATA[&nbsp; 最近接到了一个需求，需要将保存在Infopath表单中的数据提取出来。可是这么做出现了一个问题，就是经过IP上传的文件，似乎都被IP的附件控件增加了一些数据，这会导致一种颇为致命的错误，这么来做会破坏原文件的二进制布局。如果容错性不好的程序，会直接报错。比如我把word文件提出来序列化到硬盘上打开，2003会直接提示错误，2007倒是在提示错误以后，可以自动修复。不过我们不需要这种功能。<br />
&nbsp;Here we go!<br />
&nbsp;首先应该找出，调皮的Infopath到底将哪些数据藏在了文件的什么地方。动手写了一个程序，将未处理过的文件和被处理过的文件逐字节匹配，遇到不匹配的数据以后会尝试查找匹配的数据。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileStream&nbsp;fs1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileStream(</span><span style="color: #000000">@"</span><span style="color: #000000">c:\source</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;FileMode.Open);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileStream&nbsp;fs2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileStream(</span><span style="color: #000000">@"</span><span style="color: #000000">c:\dest</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;FileMode.Open);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BinaryReader&nbsp;brSrc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BinaryReader(fs1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BinaryReader&nbsp;brDst&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BinaryReader(fs2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;src</span><span style="color: #000000">=</span><span style="color: #000000">brSrc.ReadBytes(</span><span style="color: #0000ff">int</span><span style="color: #000000">.Parse(brSrc.BaseStream.Length.ToString()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;dst&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;brDst.ReadBytes(</span><span style="color: #0000ff">int</span><span style="color: #000000">.Parse(brDst.BaseStream.Length.ToString()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;destPtr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;srcPtr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;srcPtr&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;src.Length;&nbsp;srcPtr</span><span style="color: #000000">++</span><span style="color: #000000">,&nbsp;destPtr</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dst[destPtr]&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;src[srcPtr])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #0000ff">string</span><span style="color: #000000">.Format(</span><span style="color: #000000">"</span><span style="color: #000000">目标文件的第{0}位置出现与源文件{1}不匹配的情况，不匹配的字符{2}</span><span style="color: #000000">"</span><span style="color: #000000">,srcPtr,destPtr,dst[destPtr]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;destPtr&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;dst.Length;&nbsp;destPtr</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dst[destPtr]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;src[srcPtr])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(String.Format(</span><span style="color: #000000">"</span><span style="color: #000000">在第{0}个位置上，找到对应byte</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;destPtr));&nbsp;Console.Read();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">source的第{0}位与dest的第{1}位匹配</span><span style="color: #000000">"</span><span style="color: #000000">,srcPtr,destPtr);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Read();</span></div>
<br />
经过测试发现，新的文件比老文件增大了58个字节，看来我的猜测是对的，Infopath的确在文件中动了手脚!<br />
再看一下结果：<br />
<img height="87" alt="" src="http://www.cnblogs.com/images/cnblogs_com/burnett/infopath1.jpg" width="501" border="0" /><br />
<br />
还好，数据只被增加到了Infopath文件的头部。剩下的就是要分析头的格式，因为一般头都是可变长度的，所以分析格式可以动态的取出实际的infopath文件。<br />
<br />
取出这58个字节，经过Unicode解码，发现了我上传文件的文件名。联想到infopath的xml文件中，并没有存有文件名的节点，但是仍然可以在infopath中将数据显示出来的情况，问题就很好解释了。<br />
<br />
参考Infopath的官方博客的文章，<font face="Verdana">http://blogs.msdn.com/infopath/archive/2004/03/18/92221.aspx</font><br />
发现了这么一段话：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE</span><span style="font-weight: bold; color: #800000">[</span><span style="color: #800000">4</span><span style="font-weight: bold; color: #800000">]</span><span style="color: #000000">:&nbsp;Signature&nbsp;(based&nbsp;on&nbsp;the&nbsp;signature&nbsp;for&nbsp;PNG):&nbsp;<br />
<br />
(decimal)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">199</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">73</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">70</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">65</span><span style="color: #000000"><br />
(hexadecimal)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">49</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">46</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">41</span><span style="color: #000000">&nbsp;<br />
(ASCII&nbsp;C&nbsp;notation)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\</span><span style="color: #000000">307</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&nbsp;<br />
<br />
<br />
The&nbsp;first&nbsp;byte&nbsp;is&nbsp;chosen&nbsp;as&nbsp;a&nbsp;non-ASCII&nbsp;value&nbsp;to&nbsp;reduce&nbsp;the&nbsp;probability&nbsp;that&nbsp;a&nbsp;text&nbsp;file&nbsp;may&nbsp;be&nbsp;misrecognized&nbsp;as&nbsp;a&nbsp;file&nbsp;attachment.&nbsp;&nbsp;The&nbsp;rest&nbsp;identifies&nbsp;the&nbsp;file&nbsp;as&nbsp;an&nbsp;InfoPath&nbsp;File&nbsp;Attachment.&nbsp;&nbsp;<br />
<br />
<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD:&nbsp;Size&nbsp;of&nbsp;the&nbsp;header&nbsp;<br />
<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD:&nbsp;IP&nbsp;Version&nbsp;<br />
<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD:&nbsp;dwReserved&nbsp;<br />
<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD:&nbsp;File&nbsp;size&nbsp;<br />
<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD:&nbsp;Size&nbsp;of&nbsp;file&nbsp;name&nbsp;buffer&nbsp;<br />
<br />
&#183;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;name&nbsp;buffer:&nbsp;variable&nbsp;size&nbsp;<br />
</span></div>
<br />
注意到这个头文件的格式分为六个部分，除了BYTE[4]中的四个字节，其余五部分都是DWORD类型。注意，DWORD是双字，一字是两个字节，也就是说一个DWORD的大小是4个字节。问题到这里就很清楚了，前4*(4+1)个字节是固定不变的，其中，在第20到24字节保存的正是文件名的大小。<br />
<img height="84" alt="" src="http://www.cnblogs.com/images/cnblogs_com/burnett/infopath2.jpg" width="341" border="0" /><br />
<br />
<br />
OK，现在我们要做的就是找出动态的文件头，并把他们从我们的文件中剔除出去！文件的偏移量应该是 24+文件名长度。<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;namebufferlen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;dst[</span><span style="color: #000000">20</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;namebuf</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[namebufferlen];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;headLength&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">24</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;namebufferlen;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Encoding.Unicode.GetString(dst,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;headLength);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;realContent&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[dst.Length&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;headLength];</span></div>
<br />
realContent就是我们实际的文件的内容！<br />
<br />
Enjoy Infopath!<br />
<img src ="http://www.cnblogs.com/burnett/aggbug/927712.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41935/" target="_blank">[新闻]对比测试：IE8 Beta 2 VS Firefox 3.0.1</a>]]></description></item><item><title>InfoPath的上传附件控件在MOSS中失效的解决办法</title><link>http://www.cnblogs.com/burnett/archive/2007/09/04/881238.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Tue, 04 Sep 2007 03:14:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/09/04/881238.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/881238.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/09/04/881238.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/881238.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/881238.html</trackback:ping><description><![CDATA[前几日需要在Infopath中保存文件，但是发现在web方式下只要上传文件，就产生如下提示（找不到所选文件）：<br />
<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/burnett/upload.gif" border="0" /><br />
<br />
假设你的MOSS2007是默认安装。<br />
<br />
首先，打开工作流的workflow.xml文件，定位到&lt;Workflow&gt;节点。查看此节点下的此三个属性的值，<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AssociationUrl="_layouts/CstWrkflIP.aspx"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InstantiationUrl="_layouts/IniWrkflIP.aspx"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ModificationUrl="_layouts/ModWrkflIP.aspx"</span></div>
<br />
<br />
然后在以下目录中定位这三个文件：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">C:\Program&nbsp;Files\Common&nbsp;Files\Microsoft&nbsp;Shared\web&nbsp;server&nbsp;extensions\</span><span style="color: #000000">12</span><span style="color: #000000">\TEMPLATE\LAYOUTS<br />
</span></div>
<br />
依此打开这些文件，查看他们的master文件。往往他们是这么来描述的：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">MasterPageFile</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">~/_layouts/application.master</span><span style="color: #000000">"</span><span style="color: #000000"> <br />
</span></div>
<br />
然后定位到这个文件，打开它，然后定位到&lt;form&gt;标签，添加一个属性,<font size="2">enctype="multipart/form-data"。</font>然后的结果类似于这个：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">form&nbsp;</span><span style="color: #ff0000">runat</span><span style="color: #0000ff">="server"</span><span style="color: #ff0000">&nbsp;onsubmit</span><span style="color: #0000ff">="return&nbsp;_spFormOnSubmitWrapper();"</span><span style="color: #ff0000">&nbsp;enctype</span><span style="color: #0000ff">="multipart/form-data"</span><span style="color: #0000ff">&gt;</span></div>
<br />
接着保存，再重新启动IIS(必须要重启，否则会出现未知错误的提示，我想应该是MOSS的内部文件验证机制的问题)<br />
<br />
修改后，文件即可以正常上传了<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/burnett/upload2.gif" border="0" /><br />
<br />
<br />
背景知识：<br />
让我们来看看&#8220;multipart/form-data&#8221;属性在W3C里的定义吧。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">The&nbsp;content&nbsp;type&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">application/x-www-form-urlencoded</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;is&nbsp;inefficient&nbsp;for&nbsp;sending&nbsp;large&nbsp;quantities&nbsp;of&nbsp;binary&nbsp;data&nbsp;or&nbsp;text&nbsp;containing&nbsp;non-ASCII&nbsp;characters.&nbsp;The&nbsp;content&nbsp;type&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">multipart/form-data</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;should&nbsp;be&nbsp;used&nbsp;for&nbsp;submitting&nbsp;forms&nbsp;that&nbsp;contain&nbsp;files</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;non-ASCII&nbsp;data</span><span style="color: #000000">,</span><span style="color: #000000">&nbsp;and&nbsp;binary&nbsp;data.</span></div>
可见这个属性的功能是打开表单在上传中可能存在的非ASCII数据。比如照片、word文档等二进制数据。<br />
<br />
<img src ="http://www.cnblogs.com/burnett/aggbug/881238.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41934/" target="_blank">[新闻]iPhone存在严重密码安全漏洞</a>]]></description></item><item><title>WorkFlow中引入自定义类对象在类级生命周期里引发工作流异常</title><link>http://www.cnblogs.com/burnett/archive/2007/09/03/879839.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Mon, 03 Sep 2007 02:38:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/09/03/879839.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/879839.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/09/03/879839.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/879839.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/879839.html</trackback:ping><description><![CDATA[&nbsp; 问题描述：在继承于SequentialWorkflowActivity的Workflow1类里，调用自定义的IPBTask和IPBTaskContainer类，其中IPBTaskContainer类是标记为[Serializable]的自定义类，而且在Workflow1里，其生命周期是类级别上的。并且在Workflow1里实例化了IPBTaskContainer。<br />
&nbsp; 问题过程：首先启动一条新的工作流，初始化表单可以正常调出，然后启动，此时的工作流标记应该变成&#8220;进行中&#8221;，可是一旦按照问题描述中的问题进行设定，那么工作流就会直接变成&#8220;已完成&#8221;。但是任务还是可以正常生成。并且在CreateTask中的断点也可以产生中断。<br />
<br />
&nbsp; 不知道各位在工作流中引入自己的类的时候，是不是会出现这个问题。<br />
<br />
&nbsp; 这个问题我足足调试了半个星期，一开始没有想到错误居然是因为引入了自定义类。编译器在编译期也没有给出任何的警告和错误信息。总之这种异常非常隐蔽，大家以后一定要小心。<br />
<img src ="http://www.cnblogs.com/burnett/aggbug/879839.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41931/" target="_blank">[新闻]GC2008：星际争霸2进程报告 微调进程延续</a>]]></description></item><item><title>我本将心向明月，奈何明月照沟渠。安装VS2008出错</title><link>http://www.cnblogs.com/burnett/archive/2007/08/27/871380.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Mon, 27 Aug 2007 07:08:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/08/27/871380.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/871380.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/08/27/871380.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/871380.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/871380.html</trackback:ping><description><![CDATA[摘要: 仰慕vs2008的一键调试工作流大法，周末抽空装了一下，可惜......[08/25/07,16:33:23]Microsoft.NETFramework3.5:[2]Errorcode1603forthiscomponentmeans"安装时发生严重错误"[08/25/07,16:33:23]Microsoft.NETFramework3.5:[2]SetupFailedoncomponentM&nbsp;&nbsp;<a href='http://www.cnblogs.com/burnett/archive/2007/08/27/871380.html'>阅读全文</a><img src ="http://www.cnblogs.com/burnett/aggbug/871380.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41930/" target="_blank">[新闻]科学家在世界最大对撞机中观察到首批粒子</a>]]></description></item><item><title>简单的IE浏览器代理切换软件-ezProxySwitch</title><link>http://www.cnblogs.com/burnett/archive/2007/08/03/841714.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Fri, 03 Aug 2007 05:56:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/08/03/841714.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/841714.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/08/03/841714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/841714.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/841714.html</trackback:ping><description><![CDATA[在公司要用代理，回来又要把代理关掉，比较繁琐，所以无事写了一个软件，<br>虽然只有一个功能，就是一键切换浏览器在注册表中的设置。但是麻雀虽小五脏俱全，具有完整的8个类实现代理切换操作，还有异常捕获机制和配置差异化同步，比较适合.net入门者解剖学习^_^<br><br><a title=ezProxySwitch href="http://www.cnblogs.com/Files/burnett/ezProxySwtich.rar">ezProxySwitch</a><br><br><img src="http://www.cnblogs.com/images/cnblogs_com/burnett/ezProxySwitch.jpg" border=0><br>
<img src ="http://www.cnblogs.com/burnett/aggbug/841714.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41929/" target="_blank">[新闻]阿里巴巴利润增1.36倍</a>]]></description></item><item><title>关于写注册表的时候出现UnauthorizedAccessException异常的问题</title><link>http://www.cnblogs.com/burnett/archive/2007/08/02/839782.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Thu, 02 Aug 2007 01:06:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/08/02/839782.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/839782.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/08/02/839782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/839782.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/839782.html</trackback:ping><description><![CDATA[最近没有事情，写了一个可以方便切换浏览器代理的软件，可是在最后测试阶段，发现在尝试将设置写入注册表的时候出现UnauthorizedAccessException异常，提示&#8220;无法写入注册表&#8221;。百思不得其解。后来逐条查看RegisterKey的相关代码，发现在OpenSubKey方法的第二个布尔类型的参数必须设置为true。再次测试通过。<br>稍后放出这个小代理切换软件o(&#8745;_&#8745;)o..
<img src ="http://www.cnblogs.com/burnett/aggbug/839782.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41928/" target="_blank">[新闻]Google Gears覆盖四大浏览器 Safari版推出</a>]]></description></item><item><title>今天发现MOSS2007的一个非常奇怪的地方</title><link>http://www.cnblogs.com/burnett/archive/2007/03/29/693259.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Thu, 29 Mar 2007 11:56:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/03/29/693259.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/693259.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/03/29/693259.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/693259.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/693259.html</trackback:ping><description><![CDATA[我在使用对象模型读取列表中的栏的时候，发现如果是读取带有链接的栏，比如&#8220;用户和用户组&#8221;类型的栏，会得到类似于这种效果的东东：41;#小龙女。&#8220;;&#8221;前边的是id号，&#8220;#&#8221;后边的是用户名。这个似乎很好理解，因为链接嘛，就是要有一个ID在内的，可是无论我怎么转换，都无法转换成用户类型的对象。没有办法，只有自己写Split解析的，可以行通，但是感觉很不爽。不知道是不是还有其他办法
<img src ="http://www.cnblogs.com/burnett/aggbug/693259.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41927/" target="_blank">[新闻]Internet Explorer 8 Beta 2 发布</a>]]></description></item><item><title>来自MOSS2007的Sex Bomb：自定义计时器</title><link>http://www.cnblogs.com/burnett/archive/2007/03/26/688960.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Mon, 26 Mar 2007 12:13:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/03/26/688960.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/688960.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/03/26/688960.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/688960.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/688960.html</trackback:ping><description><![CDATA[<p>&nbsp; 前一段时间为了满足公司的要求，需要使用Timer的特性来进行开发。当时碰到这个需求的时候，首先想到的，就是写一个控制台程序放在服务器上跟着MOSS2007一起跑算了，可是后来想了一下，似乎在管理中心见过计时器的特性。随即打开了&#8220;计时器作业定义&#8221;，研究了半天也没有头绪，接着一头栽进SDK里搜寻了半天，发现了这个SPJobDefinition类似乎有点意思，不过需要使用SPFeatureReceiver这个类来进行部署，也就是说，制作一个可以部署的计时器，需要分成两个部分来设计：<br>&nbsp;&nbsp;&nbsp;首先，编写计时器程序，也就是继承于SPJobDefinition的类，我写的叫做EventCheckTimer。<br>&nbsp;&nbsp;&nbsp;其次，编写部署这个计时器所需要的安装器，也就是继承SPFeatureReceiver的类，我这里叫做EventCheckTimerInstaller<br>&nbsp;&nbsp;&nbsp;然后就很清楚了，使用这个Installer将EventCheckTimer部署到服务器上，部署的方式，是将feature.xml、mainifest.xml、强命名密钥、以及这两个类生成的dll文件打包成wsp格式的文件（其实就是cab文件），你也许会用到这个wsp部署的模板：<a title=wsp模板 href="http://www.andrewconnell.com/blog/articles/UsingVisualStudioAndMsBuildToCreateWssSolutions.aspx" target=_blank>wsp模板</a>。<br>&nbsp; 好的，我们引入程序：<br>这一个类是Timer Job的主类，系统主要是调用里边的Execute方法，这个方法的参数<span class=parameter>targetInstanceId（内容数据库ID）并不需要你来传递，而是系统在合适的时间在调用的时候自动传递的，你可以把它看作几乎被我们写烂的Main函数:)</span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;Microsoft.SharePoint;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;Microsoft.SharePoint.Administration;<br><br></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;MyCompany.Management.Employees<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;这一个类是计时器的主工作类，系统会按照在Installer中<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;设定的schedule定期调用此类中的Execute方法<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;EventCheckTimer&nbsp;:&nbsp;SPJobDefinition<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;EventCheckTimer()&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">()&nbsp;{&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;初始化EventCheckTimer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;更多的构造函数请参看SDK<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;param&nbsp;name="_timername"&gt;</span><span style="COLOR: #008000">计时器的名称</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;param&nbsp;name="_wp"&gt;</span><span style="COLOR: #008000">Web应用程序名称</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;EventCheckTimer(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;_timername,&nbsp;SPWebApplication&nbsp;_wp)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">(_timername,&nbsp;_wp,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,&nbsp;SPJobLockType.ContentDatabase)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Title&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">合同到期提醒器0.04</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;此方法由系统调用,contentDbId也由系统传递<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;param&nbsp;name="_contentdbid"&gt;</span><span style="COLOR: #008000">内容数据库的id</span><span style="COLOR: #808080">&lt;/param&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Execute(Guid&nbsp;<span class=parameter>targetInstanceId</span>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPWebApplication&nbsp;webApplication&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.Parent&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;SPWebApplication;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPContentDatabase&nbsp;contentDb&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;webApplication.ContentDatabases[<span class=parameter>targetInstanceId</span>];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime&nbsp;dt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">遍历当前员工库中的员工，审查所有可能的提醒事件</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">&nbsp;(SPListItem&nbsp;li&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;contentDb.Sites[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].AllWebs[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Employees</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].Lists[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">员工库</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].Items)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(li[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">合同止时间</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dt&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Convert.ToDateTime(li[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">合同止时间</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeSpan&nbsp;ts&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(dt.Date&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;DateTime.Today.Date);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果合同止时间小于当前时间，这种情况一般只发生在服务崩溃的时候</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(dt.Date&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;DateTime.Now.Date)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPListItem&nbsp;si&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;contentDb.Sites[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].AllWebs[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Employees</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].Lists[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">任务</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].Items.Add();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">标题</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;String.Format(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">{0}的合同已经到期!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;li[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">员工姓名</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">截止日期</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DateTime.Now.AddDays(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.Update();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ts.Days&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果距离现在有30天的时间，那么发出提醒</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPListItem&nbsp;si&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;contentDb.Sites[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">].AllWebs[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Employees</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].Lists[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">任务</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">].Items.Add();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">截止日期</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DateTime.Now.AddDays(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">标题</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;String.Format(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">{0}的合同将于{1}天后到期，日期：{2}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;li[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">员工姓名</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">],&nbsp;(dt.Date&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;DateTime.Now.Date),&nbsp;li[</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">合同止时间</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;si.Update();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>在设定完TimerJob的时候，就可以编写安装器了，下边是代码：其实可以照抄的，不过要注意在FeatureActivated中改成你要部署的计时器的对象，还有就是计时器的计时周期，需要改成你自己需要的。这里的BeginSecond和EndSecond指的是计时器满足触发条件的时候，在一分钟内的那一段时间内执行，比如我这就是可以在0~59秒内执行。其他计时周期类似。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;Microsoft.SharePoint;<br></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;Microsoft.SharePoint.Administration;<br><br></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;MyCompany.Management.Employees<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;这一个类的作用主要是安装某一个功能到站点上<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;被安装的对象的类必须是从SPJobDefinition继承<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;过来的<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;EventCheckTimerInstaller&nbsp;:&nbsp;SPFeatureReceiver<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;MY_TASK&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">EventCheckTimer</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;在功能被安装以后被调用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;FeatureInstalled(SPFeatureReceiverProperties&nbsp;properties)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;在功能被卸载的时候被调用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;FeatureUninstalling(SPFeatureReceiverProperties&nbsp;properties)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;在功能被激活的时候被调用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;FeatureActivated(SPFeatureReceiverProperties&nbsp;properties)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;取得当前站点的作用域</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPSite&nbsp;site&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;properties.Feature.Parent&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;SPSite;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;确保在安装此功能之前系统不被调用</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">&nbsp;(SPJobDefinition&nbsp;job&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;site.WebApplication.JobDefinitions)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(job.Name&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;MY_TASK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;安装TimerJob<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EventCheckTimer&nbsp;timer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;EventCheckTimer(MY_TASK,&nbsp;site.WebApplication);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置记时器的工作计划表，在这里是每日启动一次，运行时间00:00-05:00,更多的Timer请参看SDK，最小是只执行一次，最长是一天<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">SPDailySchedule&nbsp;schedule&nbsp;=&nbsp;new&nbsp;SPDailySchedule();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">schedule.BeginHour&nbsp;=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">schedule.EndHour&nbsp;=&nbsp;5;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPMinuteSchedule&nbsp;schedule&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SPMinuteSchedule();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;schedule.BeginSecond&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;schedule.EndSecond&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">59</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;schedule.Interval&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.Schedule&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;schedule;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.Update();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;summary&gt;</span><span style="COLOR: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;在功能被冻结的时候被调用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;</span><span style="COLOR: #808080">&lt;/summary&gt;</span><span style="COLOR: #808080"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;FeatureDeactivating(SPFeatureReceiverProperties&nbsp;properties)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SPSite&nbsp;site&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;properties.Feature.Parent&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;SPSite;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;删除这个功能</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">foreach</span><span style="COLOR: #000000">&nbsp;(SPJobDefinition&nbsp;job&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">&nbsp;site.WebApplication.JobDefinitions)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(job.Name&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;MY_TASK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.Delete();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br>如果你用了wsp安装包，那么部署激活的顺序是这样的<br>stsadm -o addsolution -filename yourwspfile.wsp <br>stsadm -o deploysolution -name yourwspfile.wsp -immediate -allowgacdeployment -force<br>stsadm.exe -o execadmsvcjobs '这一段是立即执行部署操作<br>net stop "Windows SharePoint Services Timer" '重启计时器服务，<br>net start "Windows SharePoint Services Timer"<br>resetiis<br>在解决方案管理里部署你的解决方案<br>在网站集功能里打开这个功能，就OK了。<br>如果你要卸载Timer，就比较麻烦~~~<br>首先需要在网站集功能里关闭功能，然后执行<br>stsadm -o deletesolution -name ZTEsoft.Management.Employees.EventCheckTimer.wsp -override<br>千万记着最后要重启Windows SharePoint Services Timer刷新服务，否则网站集还是会继续执行Timer服务的。<br>这点也许对于调试不是很爽，其实因为你写的程序是周期性的执行，所以你可以先模拟TimerJob的执行环境在控制台程序里执行一下，确保万事OK了，再放在Execute函数里，用Installer包装一下安装就可以了。<br>如果你只是测试，那么测试完成后一定要记得关掉网站集功能，否则也许在将来的某天，你的数据库会被同样的信息塞满的:) 
<img src ="http://www.cnblogs.com/burnett/aggbug/688960.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41924/" target="_blank">[新闻]中国软件协会：SAP羞辱国产软件是不正当竞争</a>]]></description></item><item><title>使用Web部件连接接口实现可以设置条件的过滤器</title><link>http://www.cnblogs.com/burnett/archive/2007/03/22/684145.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Thu, 22 Mar 2007 07:46:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/03/22/684145.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/684145.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/03/22/684145.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/684145.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/684145.html</trackback:ping><description><![CDATA[摘要:  在MOSS2007企业版里，默认提供了很多的过滤器，但是没有一种过滤器可以实现事先设定过滤条件，比如选择当前列表栏作为筛选条件，然后输入对应值，为了满足需求，使用了IFilterProvider接口实现一个Web部件。可以实现的功能：可以实现多条件候选值下的单一条件过滤。可以根据当前连接部件的视图自动适应栏，不需要使用者自己干预。前期的知识准备：需要有基本的Web部件的制作部署知识，需要了解We&nbsp;&nbsp;<a href='http://www.cnblogs.com/burnett/archive/2007/03/22/684145.html'>阅读全文</a><img src ="http://www.cnblogs.com/burnett/aggbug/684145.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41923/" target="_blank">[新闻]福布斯：Facebook网站十大最火爆游戏</a>]]></description></item><item><title>HRESULT 80070842 错误解决办法</title><link>http://www.cnblogs.com/burnett/archive/2007/03/16/677397.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Fri, 16 Mar 2007 08:18:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/03/16/677397.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/677397.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/03/16/677397.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/677397.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/677397.html</trackback:ping><description><![CDATA[<h2><em>当前标识(NT AUTHORITY\NETWORK SERVICE)没有对&#8220;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files&#8221;的写访问权限。</em> </h2>
<p>到网上查了一下需要重新安装asp.net服务，<br>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727&gt;aspnet_regiis -i -enable<br>开始安装 ASP.NET (2.0.50727)。<br>......................<br>ASP.NET (2.0.50727)安装完毕。<br>安装程序检测到操作过程中出现了一些错误。有关详细信息，请查看安装程序日志文件 C:\<br>DOCUME~1\ADMINI~1\LOCALS~1\Temp\1\ASPNETSetup_00003.log<br><br>查看了一下日志，发现了这个错误：<br>2007-03-16 16:02:17&nbsp;Failure &nbsp;Determining if we are running on a domain controller: IsDomainController failed with HRESULT 80070842: '没有启动服务器服务。&nbsp; '<br>在&#8220;服务&#8221;里启动Server服务，重新运行命令，通过！</p>
<img src ="http://www.cnblogs.com/burnett/aggbug/677397.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41922/" target="_blank">[新闻]谷歌允许用户评论搜索结果调整顺序</a>]]></description></item><item><title>Sharepoint 2007中可在列表中添加的内容类型</title><link>http://www.cnblogs.com/burnett/archive/2007/03/14/674203.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Wed, 14 Mar 2007 03:21:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/03/14/674203.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/674203.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/03/14/674203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/674203.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/674203.html</trackback:ping><description><![CDATA[刚才测试SPS中的列表功能，准备添加自定义的内容类型&#8220;员工信息&#8221;，可是发现自己自定义一个内容类型以后，在&#8220;添加内容类型&#8221;页面中，根本无法找到此内容类型。而后比照一下可以显示的内容类型的父类型，发现父级是以下类型的内容类型是可以添加到列表的内容类型中的：项目、公用指标列、文件夹以及继承此内容类型的子内容类型。而父级是以下内容的内容类型是无法添加到列表的内容类型中的：文档、空白页以及继承此类型的子类型。
<img src ="http://www.cnblogs.com/burnett/aggbug/674203.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41921/" target="_blank">[新闻]Internet 另一超级漏洞被公布</a>]]></description></item><item><title>VS2005下设计SharePoint工作流的代码段（Snippet）丢失问题解决</title><link>http://www.cnblogs.com/burnett/archive/2007/02/10/646826.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Sat, 10 Feb 2007 04:23:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/02/10/646826.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/646826.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/02/10/646826.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/646826.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/646826.html</trackback:ping><description><![CDATA[<a href="http://www.mscourse.com/blog/u/windie/archives/2007/143.html">http://www.mscourse.com/blog/u/windie/archives/2007/143.html</a><br><br>主要还是模板安装的时候没有完全定制好~~
<img src ="http://www.cnblogs.com/burnett/aggbug/646826.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41920/" target="_blank">[新闻]3 个独特的未来搜索引擎</a>]]></description></item><item><title>官方的"介绍 .NET Framework 3.0”</title><link>http://www.cnblogs.com/burnett/archive/2007/02/07/643532.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Wed, 07 Feb 2007 06:16:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2007/02/07/643532.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/643532.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2007/02/07/643532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/643532.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/643532.html</trackback:ping><description><![CDATA[<A href="http://www.microsoft.com/china/MSDN/library/netFramework/netframework/intronetfx30.mspx?mfr=true">http://www.microsoft.com/china/MSDN/library/netFramework/netframework/intronetfx30.mspx?mfr=true</A><BR><BR>着重介绍了四个新增加的组件：Windows Workflow Foundation、Windows Communication Foundation、Windows CardSpace 和 Windows Presentation Foundation<img src ="http://www.cnblogs.com/burnett/aggbug/643532.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41919/" target="_blank">[新闻]诺基亚新机N85 N79发布</a>]]></description></item><item><title>工程上的一些经验点滴</title><link>http://www.cnblogs.com/burnett/archive/2006/04/28/387750.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Fri, 28 Apr 2006 10:03:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2006/04/28/387750.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/387750.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2006/04/28/387750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/387750.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/387750.html</trackback:ping><description><![CDATA[<p>最近应同学邀请,帮他的老板做一个增值业务的平台,这是我正式接触商业编程环境,也是第一次用.net做实际的东西.做的时候不敢妄称最好,但是我的确是为了性能,每一步都尽量优化系统的结构.以下是我积累起来的经验,以后会陆续加入的.因为是工程上的东西,所以可以采百家之长,各路高手前辈不吝指点!</p>
<ul>
    <li>详细设计阶段用的时间长不是坏事.现在我越来越深入到系统细节,发现当时的文档写的越是粗糙.感觉到有必要停下来和同事再把详细设计完善一下.
    <li>在做页面的时候,最好把各个部分切割成模块,使用用户自定义控件填充,这样做的好处是,首先,在制作页面的时候,没有必要把全部的页面都调出来配着当前模块一起被编辑,事实上,一个人同时只能编辑一个模块.而且在调试的过程中,如果不小心动了其他调试好的模块(这里指的是全部没有被模块化的"模块"),有可能要返回调试其他的模块.这是血的教训.
    <li>在详细设计阶段,最好可以面向操作抽象对象,比如,很有必要对数据库操作这个"对象"进行抽象,我做了一个这样的类SqlDbOperHandler,使用这个类,用三步就可以把数据插入到数据库中.不过在制作这个类的时候,一定要完善异常处理机制,应该把所有产生的异常及时通知用户,而不是默默的PASS.
    <li>在一个页面中使用用户自定义模块,最好可以用属性打开对外的接口,并且建立一个初始化函数,专门初始化这个类.如果一个自定义模块被多次调用,则应该把这个模块的某些公有对象提取出来(比如数据库操作对象),用模块的初始化函数引入到模块内,以减轻对象的频繁调用析构. </li>
</ul>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/burnett/aggbug/387750.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41918/" target="_blank">[新闻]数据库市场:微软和甲骨文快速进步 威胁IBM</a>]]></description></item><item><title>dotNet学习笔记－浅谈.Net的事件代理</title><link>http://www.cnblogs.com/burnett/archive/2006/03/17/352037.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Fri, 17 Mar 2006 03:42:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2006/03/17/352037.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/352037.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2006/03/17/352037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/352037.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/352037.html</trackback:ping><description><![CDATA[<span style="COLOR: #ff9900">前言:这是一篇以前我在csdn上面写的一篇文章(</span><a href="http://blog.csdn.net/closetome"><span style="COLOR: #ff9900">http://blog.csdn.net/closetome</span></a><span style="COLOR: #ff9900">),是寒假我第一次深入接触.net代理机制的一段学习笔记.如有不对的地方,还请大家不吝指教..</span><br><br><span style="BACKGROUND-COLOR: #f5f5f5">&nbsp; .Net下的事件驱动机制是建立在委托(Delegate)模型下面的，从字面上来解释Delegate的意思就是代理某一样事务，就像现实生活中的买卖一样，各个商场会从生产商那里取得货物的经销代理权，从而商场只负责商品的加工而不必劳神市场。在.Net里的代理机制也是这样，我只要将一个函数逻辑的使用权交给另外一个逻辑，我就可以将我的精力放在其他的事情上面了，这里的逻辑意思就是代码结构。<br>&nbsp; 不过这个时候要注意程序的主导权是在响应事件的函数那里还是在发布事件的函数那里.在多线程的编程中这种主导权的问题会演变成一种和主线程争夺权限的问题(结果很明显,胳膊扭不过大腿,主线程还是拥有对象的所有权,解决的办法是建立一个后台工作者线程BackgroundWorker,再调用一个回调函数,让主线程响应这个回调就可以了.代码放在学校了,改天拷上来.)<br>&nbsp; 这在Win32时代就是回调函数(CallBack)，学过C++的程序员可能比较熟悉函数指针这种称呼。代理在Event中的应用基本上就是函数指针的作用。<br>其实我这几天一直在思考这种回调机制的运作方法，虽然头脑有点模糊，但是还有这么点意思，也许只有把它变成文字以后，我才能发现其中的对错。<br>声明使用一个代理其实非常容易：<br>public class WorldCup2006<br>{<br>&nbsp;&nbsp;&nbsp; public delegate void WatchTheGameHandler(/*args list*/);//注意这里的args list就是所谓的代理签名，必须和要绑<br>定的函数的参数列表一致<br>&nbsp;&nbsp;&nbsp; public event WatchTheGameHandler WatchTheGame;//这就声明了一个事件<br>&nbsp;&nbsp;&nbsp; public void GotoGerman(){....};<br>&nbsp;&nbsp;&nbsp; public void StayatHome(){....};<br>&nbsp;&nbsp;&nbsp; public void WithTheTeamCoachAndMM(){....};<br>}<br>/*<br>注意以下两种方式，你可以选择其中之一，也可以两种都选，<br>//"+="是重载的操作运算符，你可以不必关心它，<br>当然你也可以写成WatchTheGame=WatchTheGame+new WatchTheGameHandler(GotoTheGerman);<br>*/<br>WatchTheGame+=new WatchTheGameHandler(GotoGerman);<br>WatchTheGame+=new WatchTheGameHandler(StayatHome);<br>WatchTheGame+=new WatchTheGameHandler(WithTheTeamCoachAndMM);<br><br>大致的模型应该是这样的：<br>&nbsp; 每一个类中会存在这么一组代理：比如有一个我定义的WorldCup2006这个类，其中有WatchTheGame,HaveATest...等等的响应事件的代理，这些代理的作用就是当它与相应的逻辑建立连接的时候（注意这里可以建立一对多的关系，也就是一个代理可以对应多个操作逻辑），在激发了某种消息（比如鼠标左键的按下行为）的时候，可以执行相应的逻辑（就象前面所说的，可能是一个逻辑，也可能是多个，主要在于向代理注册的逻辑有多少个）。其实我们不用代理也行，重载WorldCup2006然后自定义响应各种用户操作。所以使用代理的好处就在这里显现出来了，给出了一个对外自定义响应消息的一个接口。我可以把我想要的操作绑定到特定的消息上面。解释以上的代码就是：2006年德国世界杯就要开始啦（实例化一个类），你怎么观看这场比赛呢（产生一个消息）？是呆在家里看电视（将WatchTheGame绑定到StayatHome()逻辑上）还是去德国观看现场（将WatchTheGame绑定到GotoGerman()上），其实只要你有钱，还可以坐在教练席里和MM坐在一起看哦（将WatchTheGame绑定到WithTheTeamCoachAndMM()）。&nbsp;<br>其实接触到.net的内部还是这几天的事情，因为要写一个在windows下运行较多的程序，所以从java转变到了.net这里，发现.net和java的理念有一些差别，.net崇尚的是封装，把它的东西封装得严严实实得就等你调用就行，方便归方便，让你很难摸索到其中得运行机制，有时候做完程序都不知道怎么写出来的（不过要比Delphi好多了），但是java就不是这样，该暴露的地方就暴露出来，该隐藏的就隐藏，大方得体，让人写一遍程序就有一遍的收获，所以java强调的是框架，而.net强调的封装。<br><br>&nbsp;小弟第一次写文章，打小语文没有学好，条理不是很清楚，有什么不对的地方，希望多交流交流</span> 
<img src ="http://www.cnblogs.com/burnett/aggbug/352037.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41917/" target="_blank">[新闻]深度分析：全球千亿美元市值IT企业7月榜单点评</a>]]></description></item><item><title>Ajax初探:MagicAjax使用方法</title><link>http://www.cnblogs.com/burnett/archive/2006/03/10/347416.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Fri, 10 Mar 2006 10:04:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2006/03/10/347416.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/347416.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2006/03/10/347416.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/347416.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/347416.html</trackback:ping><description><![CDATA[<BR>&nbsp;&nbsp;&nbsp;这几天接手了一个BS模式的程序,心血来潮,准备把AJAX风格的页面引入进来,倒腾了一会,把magicajax的一个初级的DEMO做了出来,现在把整个过程放出来.<BR>&nbsp; 1.到<A href="http://sourceforge.net/projects/magicajax">http://sourceforge.net/projects/magicajax</A>下载最新版本的MA,然后解压缩,导入到你的工具箱中(如图一,图二,图三所示),<BR><IMG alt="" hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/burnett/文章/Snap1.jpg" align=baseline border=0>图一<BR><BR><IMG alt="" hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/burnett/文章/Snap2.jpg" align=baseline border=0>图二<BR><BR><IMG alt="" hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/burnett/文章/Snap3.jpg" align=baseline border=0>图三<BR><BR><BR><BR>然后就会见到四个新加入的控件(如图四),分别是 
<LI>AjaxPanel <BR>这个是基本的异步通讯容器,你只要把以前需要PostBack的组件(比如按钮)放在这个Panel里就可以实现无刷新页面的效果了 
<LI>AjaxZone <BR>这个组件的作用主要是获取在一个回调(CallBack)陷入中的状态,说明书上说使用这个组件可以稍稍提高服务器的响应速度. 
<LI>ClientEventTrigger <BR>捕获一个客户端事件的触发器,需要注意的是,需要把它的事件名称与客户端触发的事件名称对应起来,并且ControlID属性必须和发布事件的客户端的属性吻合. 
<LI>KeyClientEventWrapper <BR>这个是客户端事件的捕获器,用来捕获客户端激发的事件,比如点击click,聚焦forcus等等.<BR><IMG alt="" hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/burnett/文章/Snap4.jpg" align=baseline border=0>图四 
<P>在工程的web.config里添加下面几处配置:<BR>&nbsp;&lt;configSections&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;section name="magicAjax" <BR>&nbsp;&nbsp;&nbsp;type="MagicAjax.Configuration.MagicAjaxSectionHandler, MagicAjax"/&gt;<BR>&nbsp; &lt;/configSections&gt;</P>
<P>&nbsp; &lt;magicAjax<BR>&nbsp;&nbsp;outputCompareMode="HashCode"<BR>&nbsp;&nbsp;tracing="false"&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;pageStore<BR>&nbsp;&nbsp;&nbsp;mode="NoStore"<BR>&nbsp;&nbsp;&nbsp;unloadStoredPage="false"<BR>&nbsp;&nbsp;&nbsp;cacheTimeout="5"<BR>&nbsp;&nbsp;&nbsp;maxConcurrentPages="5"<BR>&nbsp;&nbsp;&nbsp;maxPagesLimitAlert="false"<BR>&nbsp;&nbsp;/&gt;<BR>&nbsp; &lt;/magicAjax&gt;<BR><BR>在system.web节点里添加<BR>&nbsp;&nbsp;&nbsp; &lt;httpModules&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;add name="MagicAjaxModule" type="MagicAjax.MagicAjaxModule, MagicAjax"/&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/httpModules&gt;<BR><BR>下面就进入了实质性的阶段,使用MagicAjax.net建立一个无刷新的显示时间操作.<BR><BR>打开一个aspx文件,然后在上边拖入一个AjaxPanel,然后拖入一个textbox和button(图五),然后的事情和普通方式的调用一样了.在button的click事件响应逻辑里添加:<BR>&nbsp;tb_time.Text = System.DateTime.Now.ToString("yyyy-MM-dd hh:mm;ss");<BR><BR><IMG alt="" hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/burnett/文章/Snap5.jpg" align=baseline border=0>图五<BR>结果如图六,就这么简单一步,试试吧.<BR><BR><IMG alt="" hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/burnett/文章/Snap6.jpg" align=baseline border=0>图六<BR><BR>PS:腾讯的浏览器老是出故障.好不容易写到一半的文章又没有了,重头来过吧.还有,这个是第一次写图文教程,希望老鸟慢点砸.</P></LI><img src ="http://www.cnblogs.com/burnett/aggbug/347416.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41916/" target="_blank">[新闻]中移动上半年净利549亿元 每天盈利3亿</a>]]></description></item><item><title>两个.net下的AJAX工具包（Toolkit）</title><link>http://www.cnblogs.com/burnett/archive/2006/03/09/346776.html</link><dc:creator>Burnett</dc:creator><author>Burnett</author><pubDate>Thu, 09 Mar 2006 15:27:00 GMT</pubDate><guid>http://www.cnblogs.com/burnett/archive/2006/03/09/346776.html</guid><wfw:comment>http://www.cnblogs.com/burnett/comments/346776.html</wfw:comment><comments>http://www.cnblogs.com/burnett/archive/2006/03/09/346776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/burnett/comments/commentRss/346776.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/burnett/services/trackbacks/346776.html</trackback:ping><description><![CDATA[摘要: AJAX凭借着GOOGLE和LIVE.COM的成功使用将WEB浏览器领入下一个无刷新页面的时代,这也标志着在业内使用十几年的现有web标准将被历史淘汰.<br>现在基于ASP.NET的AJAX框架是,Altas和AjaxAspects,这两种框架要求程序员拥有丰富的脚本编写经验,不是初学者的首选,而工具包类型的MagicAjax和zumiPage则在不影响现有WEBUI的基础上来体验AJAX的优点,本文介绍这几个AJAX开发包的下载地址和部分的DEMO(参考了其他的几个blog).&nbsp;&nbsp;<a href='http://www.cnblogs.com/burnett/archive/2006/03/09/346776.html'>阅读全文</a><img src ="http://www.cnblogs.com/burnett/aggbug/346776.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41915/" target="_blank">[新闻]中国移动谋划推出Web2.0产品mspaces.net</a>]]></description></item></channel></rss>