RSS

组织结构配置文件的诡异行为

组织结构配置文件(OrganizationProfile),大家可能比较陌生,尤其对编程访问。具体的操作我就不在这里一一列举了,SDK里面也有例子,这里面只说一个可能和我们的预期不太一样的一个API行为。

在组织结构配置文件中,一个组织中的成员分为两种类型,Leader和Member。可以通过OrganizationProfile的AddMember方法来向这两个部分中加入用户(通过一个参数来进行区分是Leader还是Member),并通过RemoveMember的方式删除之。

如果这个用户不在Member中,我们可是使用下面这句话把用户user1加为Leader

   1: orgProfile.AddMember("domain\\user1", 
   2:               OrganizationMembershipType.Leader);

假设在之前这个组织中空无一人,执行完上面这句话的时候,user1既会出现在Leader中,也会出现在Member中,也就是说这个用户同时会自动加到Member里。这个行为很好理解,也make sense。

BUT!(又来了)

假设这个时候user1已经是Leader了(当然他也是Member),看下面这个代码:

   1: orgProfile.AddMember("domain\\user1",    
   2:               OrganizationMembershipType.Member);

执行完这句话你觉得会发生什么?把user1又一次加为Member,你觉得在上面那种假设情况下,应该不会发生任何变化是吧?错了!当我们执行完这句话的时候,user1还在Member中,但已经从Leader中消失掉了。很奇怪吧……我相信这是一个By Design的Bug……

换句话说,当我们要把一个用户加为成员的话,首先你得看一下这个用户是不是已经在成员中了,如果他已经存在,就不要再加一遍了。否则,万一这位用户是这个组织的领导,你一加,领导就没了(这在中国的项目中是多么可怕的行为)

 

Posted by on 2011 年 06 月 30 日 in SharePoint

Leave a comment

Tags:

UserProfile创建时拒绝访问?

这两天在做一个POC,组织结构的同步。做了一个通用框架,为了做示例和测试,写了一个到用户配置文件(UserProfile)和组织结构配置文件(OrganizationProfile)的接口,然后通过事件处理程序来调用UserProfile的相关接口,把信息同步到用户配置文件中。

然后就出现了问题:在通过事件处理程序调用UserProfileManager的CreateUserProfile方法时,SharePoint抛出了一个拒绝访问的异常:只有管理员和和本人才能创建用户配置文件云云……可是我执行的账号本来就是系统账号啊,我还又去User Profile Service那边查了一下,有完全控制的管理员权限啊……

然后经过一番搜索,发现关键问题的所在:

UserProfileManager在创建的时候,是依赖HttpContext(不是SPContext)的,而事件处理程序中是没有HttpContext的(即使在w3wp进程中运行也没有,SPContext也没有)。(但是为什么用Console程序写UserProfile程序的时候,也没有HttpContext,就能执行成功呢……不解)

临时岔开一下,而且由于是依赖HttpContext而不是SPContext,在提升权限的时候也会出一些问题,网上有人是重新构造了HttpContext作为创建SPServiceContext的参数,然后再去创建UserProfileManager。期间还用到了反射的方法修改WindowsIdentity的某个非公开属性……

上述方法太麻烦,于是我决定绕路,写一个Web Service扔到layouts里,这样就有HttpContext的上下文信息了。然后在事件处理程序中调用Web Service,并使用DefaultCredential(嗯,在我的场景中,只有管理员有权限去管理这个组织结构,所以直接传递当前身份,也不需要做权限提升)。看起来一切正常了……

BUT!人生最厉害的就是这个BUT!(好吧,这句话是九把刀说的)

当我去调用RemoveUserProfile,妄图去删除一个用户配置文件的时候,再次爆发了拒绝访问的异常(同样的代码Console还是正常,无语)。然后搜索了一下,发现msdn论坛上的一个帖子中描述了类似的问题,不过是在2007中的,本着试试看的方式按照如下方法尝试了一下(2007中的ServerContext被废弃,换成了SPServiceContext):

   1: SPSecurity.RunWithElevatedPriviliges(delegate(){
   2:   HttpContext oldCtx = HttpContext.Current;
   3:   SPServiceContext sc = SPServiceContext.GetContext(oldCtx);
   4:   HttpContext.Current = null;    // 亮点在这里
   5:   UserProfileManager upm = new UserProfileManager(sc);
   6:   upm.RemoveUserProfile("domain\\user");
   7:   HttpContext.Current = oldCtx;  // 还原回来
   8: });

于是乎就可耻的成功了……我表示很费解,也很无语……

 

Posted by on 2011 年 06 月 30 日 in SharePoint

Leave a comment

Tags:

SharePoint 2010 SP1更新发布

前几天微软SharePoint产品组正式发布了产品的SP1,中文版下载地址如下:

1、SharePoint Foundation 2010 Service Pack (KB2460058)

2、Microsoft SharePoint Foundation 2010 Language Pack Service Pack (KB2460059)(中文语言包)

3、Microsoft SharePoint Server 2010 Service Pack (KB2460045)

4、Server Language Pack 2010 Service Pack (KB2460056)(中文语言包)

5、Microsoft Office Web Apps 2010 Service Pack (KB2460073)

安装顺序也如上所示(如果你没有安装语言包的话,可以跳过2、4)。

[6月30日更新]如果你只安装了Foundation的话,只需要装1、2;如果你装的是Server,则不再需要安装Foundation的SP1,因为Server的SP是包含了FoundationSP的。(李劼的这篇Blog解释得很清楚:点我点我

此外,官方网站上也描述了一些安装的已知问题和注意事项(原文地址点我),主要包括:

  • 要确认有足够的剩余磁盘空间(几个SP的安装文件加一起有600来MB)
  • 安装SP1之后必须要重启计算机(当然重新运行配置向导是肯定要的,这个不用多说了)
  • 如果你只打算安装OWA的SP1,而SharePoint还保留在RTM(非SP1)版本的话,需要预先装两个补丁文件25106392510648,然后再安装OWA的SP1。
  • 在安装完SP1之后,新建的网站集的工作流Feature默认会禁用,需要手动启用一下(为啥会这样……)

 

此外,需要注意的是SP1包含了到2011年4月份为止的所有安装更新,但是不包括最新的6月份的安全更新(CU),所以微软建议在安装完SP1之后,再安装一下6月份的CU。不过一般来说,我们认为在生产环境中,除非确实遇到了问题,而且确认CU能够解决这个问题的话,再去安装,否则有一定的风险。

除了累积安全更新外,SP1还主要提供了如下更新内容:

  • 支持安装在SQL Server Denali上(下一版的SQL,目前还只有测试版)
  • 支持在移动网站集的时候使用浅拷贝(Shallow Copy,从文档来看,这个主要是针对应用了RBS的网站集,在迁移到另外一个内容数据库的时候,可以保留以前的RBS存储位置等设置)
  • 网站和网站集的回收站(这个功能终于出现了……现在你在删掉一个网站或网站集之后,可以很方便地从回收站里再还原回去了,就像以前还原列表或文档一样)
  • 增加了StorMan.aspx管理页面,可以查看到网站中文档库具体的存储大小,便于IT进行监控和管理
  • PPS中筛选器的改进
  • 增加对Chrome浏览器的支持
 

Posted by on 2011 年 06 月 29 日 in SharePoint

Leave a comment

Tags:

左侧导航太长了?

这是目前正在做的这个POC的一个副产品,嗯。

当左侧导航太长的时候,通过js加上一个折叠展开的效果(用jquery,嗯),在页面里导航加载后的任何地方以任何一种形式执行如下的js(引用jquery的部分略掉):

   1: $('div.vertical > ul.root > li').each(function () {
   2:   var $a = $("<a style='float:right' href='javascript:void(0)' exp='1'><img border='0' src='/_layouts/images/dlmin.gif'/></a>")
   3:               .click(function () {
   4:                 if ($(this).attr('exp') == '1') {
   5:                   $(this).find('img').attr('src', '/_layouts/images/dlmax.gif');
   6:                   $(this).attr('exp', '0');
   7:                   $(this).parents('.menu-item').next().slideUp();
   8:                 } else {
   9:                   $(this).find('img').attr('src', '/_layouts/images/dlmin.gif');
  10:                   $(this).attr('exp', '1');
  11:                   $(this).parents('.menu-item').next().slideDown();
  12:               }
  13:             });
  14:   $(this).find('span:eq(2)').append($a);
  15: });

代码很简单,我就不解释啥了,效果如下图(归功于jquery,这个是带收缩展开动态效果的哦):

image

(这个导航的样式是靠CSS实现的,跟本文没啥关系)

当然,现在这个打开的时候依然是所有二级导航都处于展开状态,稍微修改一下上面的代码就可以很容易实现页面刚加载的时候默认折叠一些或所有的一级导航。

 

Posted by on 2011 年 06 月 24 日 in SharePoint

Leave a comment

Tags:

多语言和自定义CSS

最近在一个SharePoint 2010项目中发现,在装了英文、日文语言包之后,在网站设置的语言设置中,选择备用语言的时候,系统返回一个异常,大意是包含自定义样式表(CSS)的网站不支持多语言。

之前一直没太注意到底什么算是“自定义CSS”,经过一番研究,发现了问题:

一般网站引用CSS的时候,引用的都是layouts目录中的文件(比如/_layouts/2052/Styles/corev4.css),这个CSS显然是整个服务器场共用的;但是出问题的这个网站引用的是本网站中的/_styles/corev4.css(这不是个虚拟路径,就是在网站中的一个目录,存在数据库里的)——这个就是所谓的“自定义CSS”。你想啊,人家在layouts里面的CSS是按照语言划分的,不同语言的情况下引用的是不同的CSS,而在_styles里面,全都一样,当然不成了,于是多语言就不干了。

那么下一个问题就是,这个自定义CSS到底是怎么出现的?怎么恢复成非自定义CSS?到底应该怎么去修改默认的CSS?一个一个来。

一、自定义CSS是如何出现的?

其实自定义CSS从SharePoint 2007的时候就出现了,但是由于当时并没有2010这种多语言机制,并没有把这个问题凸显出来。

经过一番调查,发现这个是由于我们的美工在使用SharePoint Designer改CSS的时候造成的。在SPD里面打开一个页面,页面里面自然会列出若干class,而当我们按住Ctrl键点击这些CSS的时候,就会打开对应CSS文件的编辑:

image

而当我们保存这个CSS的时候:

image

看到“自定义样式表”了吧?就是从这儿来的。一旦点了“是”,SharePoint就会把layouts下对应的这个CSS文件保存到网站的_styles目录中(如果之前没这个目录会自动创建一个,注意这是个目录,不是个文档库)。其实这是非常合理的,总不能因为你要修改页面里的一个CSS,就要影响到整个服务器场的所有网站吧?于是就有了这个类似于unghost的过程。

当然,使用对象模型的方式也可以很方便地完成这个过程,只需要一句话:

   1: spWeb.CustomizeCss("corev4.css");

(其实我就是翻SDK翻到的这个方法,然后用reflector确定了那个多语言就是这个东西造成的)

二、如何恢复成非自定义CSS?

既然知道了自定义的方法,恢复就有头绪了。直接写个Console,同样用一句话搞定:

   1: spWeb.RevertCss("corev4.css");

三、到底应该如何自定义CSS?

标准的做法当然不是去修改layouts下的CSS文件(除非你想整个服务器场所有网站都变化)。你可以把你要改的地方单放到一个CSS里,然后设置成网站的备用CSS,见下图:

image

上面这个界面是在网站设置 – 母版页(不是库分类下的那个母版页),这是在开启了发布功能的前提下才会出现的一个链接。如果没有开启发布功能的话,直接进去“/_Layouts/ChangeSiteMasterPage.aspx”这个页面应该也行(我没试过),或者干脆用程序改一下。这个备用CSS会自动放在系统默认的CSS文件之后进行引用,所以会覆盖掉默认的CSS样式(默认样式中有一些是标记了“!important”的,在自定义CSS里想要覆盖这个设置的话也要加上这个)

当然你也可以改母版页,在系统CSS引用(母版页中的SharePoint:CssLink和SharePoint:Theme)之后,使用SharePoint:CssRegistration控件进行引用,这样也可以自动根据不同的语言自动进行切换(具体的写法请自行msdn或者google)

 

Posted by on 2011 年 06 月 17 日 in SharePoint

Leave a comment

Tags: ,

SharePoint 2010中自定义字段的变化

自定义字段类型在SharePoint 2007的时代出现,一举弥补了很多应用中的不足,很久之前也写过一篇关于用自定义字段类型拼装应用的Blog:《将SharePoint提升为应用开发平台》(之前Blog上的图都没了,某天突然有人告诉我说这篇文章被放到MSDN上了,汗……)

在SharePoint 2010中,自定义字段类型的开发大致没什么变化(我还没有测试过那个非常恶心的自定义字段类型的自定义属性的自定义设置画面的保存问题,在2010里面有没有得到改善,有时间试一下……)。但是在处理显示的时候,和2007相比有了很大的变化。

众所周知,2010中列表视图的默认WebPart已经从LVWP(ListViewWebPart)换成了XsltListViewWebPart,因此在默认情况下所有字段在视图中的显示,都是通过XSLT来渲染的。因此,当我们把一个2007里面写好的自定义字段类型部署到2010上的时候,会发现在fldtypes_***.xml中写的那些DisplayPattern和HeaderPattern都不生效了。

这里面有两个处理方法:

方法一:让CAML渲染重新生效,只需要在那个xml文件中加入如下一行就行:

   1: <Field Name="CAMLRendering">TRUE</Field>

方法二:使用新的xslt渲染机制。

在14\TEMPLATES\LAYOUTS\XSL目录中,创建一个fldtypes_***.xsl文件,将字段的视图渲染放进去(SharePoint默认的那些字段渲染样式就是该目录中的FLDTYPES.xsl文件,可以作为编写时的参考),建立形如下面的这种内容:

   1: <?xml version="1.0" encoding="utf-8"?>
   2: <xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
   3:                 xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
   4:                 version="1.0"
   5:                 exclude-result-prefixes="xsl msxsl ddwrt"
   6:                 xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
   7:                 xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
   8:                 xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
   9:                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  10:                 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  11:                 xmlns:SharePoint="Microsoft.SharePoint.WebControls"
  12:                 xmlns:ddwrt2="urn:frontpage:internal">
  13:   <xsl:template match="FieldRef[@FieldType='CustomField']" mode="Note_body">
  14:     <xsl:param name="thisNode" select="." />
  15:     <xsl:value-of select="$thisNode/@*[name()=current()/@Name]"
  16:                   disable-output-escaping="yes" />
  17:   </xsl:template>
  18: </xsl:stylesheet>
  19:  
  20:  

SharePoint是通过其中的下面这一行来匹配字段的:

   1: <xsl:template match="FieldRef[@FieldType='CustomField']" mode="Note_body">

match属性决定了字段的匹配规则,上图中是使用FieldType,也就是字段类型来进行匹配,这个值和在fldtypes_***.xml中定义的TypeName的值是要保持一致的。除此之外,这里也可以使用字段名称来进行匹配,例如:

   1: <xsl:template match="FieldRef[@Name='MyField']" mode="Note_body">

来匹配所有内部名称为“MyField”的那些字段,后面的mode是字段显示的基础样式类型,可以参考FLDTYPES.xsl中的内容。

在SharePoint 2007中,DisplayPattern除了能够控制视图的显示样式之外,还可以控制在字段查看状态下(比如列表条目查看页面DispForm.aspx)中的样式。但是到了2010里面,不论是DisplayPattern还是xslt,都只能够控制视图中的显示样式,而控件查看状态下的样式,必须通过字段的控件来进行定义——这样也造成了2007的时候,控件和CAML都可以定义查看样式的冲突。

BTW,其实我不太会写xslt,本来想用CAML就完了,结果发现在继承多行文本(SPFieldMultiLineText)的时候,html死活显示不出来,一直都被编码,google许久没找到原因,最后只好上了xslt的贼船,有时间需要系统的学一下xslt了……

一些参考文章:

1、How to: Customize the Rendering of a Field on a List View

2、RenderPattern Element (Field Types)

3、Custom field type list view rendering in XSLT (一个例子)

 

Posted by on 2011 年 02 月 22 日 in SharePoint

Leave a comment

Tags:

SharePoint程序中的多语言支持

前些天 kaneboy 在博客中写了一篇关于SharePoint UI多语言支持的博客:《SharePoint 2010多语言UI,以及开发人员需要注意的》,本篇内容是对这篇Blog的一些补充和完善。

涂总的blog中主要是在介绍关于列表名称、字段名称等这些内容的多语言设置,在用程序创建一个列表/字段的时候,为了能够支持多语言,应该使用XXXResource属性来代替XXX属性(例如TitleResource代替Title)。实际上,如果我们是在网站中直接创建的这个列表/字段,例如在中文网站中(默认语言),创建了一个叫“QQ号码”的字段;而当我们切换到另一种语言的时候(比如英文),我们直接对这个字段改名为“QQ Number”,这个时候并不会覆盖中文语言的名称,而是只改变当前语言下的字段名称设置。通过这种方式,我们也可以在不同的语言环境中对同一个字段使用不同的名称。

需要注意的是,如果我们在网站设置 – 语言设置中,将“覆盖翻译”设置为“是”的时候,一旦我们在默认语言的网站中更改了字段名称,那么会覆盖掉其他语言网站的名称设置,我们需要重新切换语言,再进行一次设置。见下图:

image

下面介绍一些SharePoint中和多语言编程相关的对象模型

1、如何获取不同语言下,网站中一些默认文本?

通过使用SPResouce的静态方法GetString,该方法有两种重载:

   1: public static string GetString(string name, params Object[] values);
   2: public static string GetString(CultureInfo culture, string name, params Object[] values);

第一种方法是获取当前语言下指定的字符串,第二种是获取指定语言下指定的字符串(通过第一个参数)。

第二个参数就是资源字符串的名称,例如“LanguageNameInLocalizedLanguage”就是使用的语言,如果环境是简体中文,取到的就是“中文 – 简体”,如果环境是英文,取到的就是“English”。

第三个参数是使用的值,如果第二个参数中的字符串包含诸如{0}、{1}这样的占位符,则在第三个参数中指定这些占位符的具体值。

2、如何知道服务器上安装了哪些语言包?

有两种方法可以取得:

   1: spRegionalSettings.InstalledLanguages;
   2: SPRegionalSettings.GlobalInstalledLanguages;

第一种方法要先获取一个SPRegionalSettings对象,可以通过spWeb的RegionalSettings属性获取或者直接使用SPContext.Current.RegionalSettings;第二种方法是SPRegionalSettings的一个静态属性。

两种方法返回的都是SPLanguageCollection类型的对象,在SPLanguage中包含了LCID属性和DisplayName属性可以分别取得语言的lcid和显示名称(经测试,这个显示名称好像就是在默认语言下的显示名称,不会跟着当前环境语言而改变)

3、如何知道当前网站可以使用哪些语言?

在网站设置 – 语言设置中,可以选择当前网站中可以使用的语言,包括默认语言,以及备用语言(如果这边不选中对应的备用语言的话,即使安装了语言包,在网站中也用不了这个语言)。

通过使用spWeb的SupportedUICultures属性,可以获取到当前网站可以使用的语言,这个属性是一个IEnumerable<CultureInfo>类型的对象。需要注意的是,这个属性在沙盒解决方案中是不可用的。

4、如何得知网站的默认语言?

在后台程序中,可以通过spWeb的Language属性(int类型),获取默认语言的lcid。

在前台JavaScript程序中,可以通过_spPageContextInfo.webLanguage来获取这个lcid。

5、如何得知当前网站上正在使用哪种语言?

在后台程序中,可以通过Thread.CurrentThread.CurrentUICulture来获取当前环境的语言地区设置。

在前台JavaScript程序中,可以通过变量g_wsaLCID或者_spPageContextInfo.currentLanguage获取到当前语言的lcid。

 

那么,SharePoint网站支持多语言有哪些方式呢?

一种方式就是从2007沿用下来的,使用变体的方式(仅在server版中才有),这种方式是为每个语言创建一个独立的网站。

另一种方式,就是2010新增的,在同一个网站中对多语言的支持(也是上文反复说明的)。在这种方式下,网站的标题、描述信息,列表的标题、描述信息,字段的标题、描述信息,导航结点,托管元数据都是有多语言支持的。如果想要让一个普通的列表字段内容也支持多语言(在不同语言环境中显示不同的值),那就需要开发自定义字段类型了(2010中,只有托管元数据字段类型是包含多语言支持的),下图是一个开发好的一个多语言单行文本的效果:

编辑画面:

image

中文下的显示画面:

image

英文下的显示画面:

image

 

Posted by on 2011 年 02 月 22 日 in SharePoint

Leave a comment

Tags:

SharePoint中详细的版本对比

众所周知,在SharePoint 2007的时候,列表和文档库都支持了版本控制,并且在版本控制中,可以看到哪些字段发生了变化,如下图所示:

image

不过在最近,某个项目中,客户说:这个版本历史记录没啥用啊(做的是公文管理模块),我得知道我发的好长好长一段的公文(用的一个多行文本实现的),到底是什么地方变了,得用个红字给我标出来。然后我们乙方在场的人就无语了。

这种对比两个文本字符串区别的功能,有个正式的名字叫做“字符串编辑距离(Edit Distance)”,通俗一点说就是怎么从一个字符串,通过增加、变更、删除的动作,变成另一个字符串的。这是动态规划算法的一个典型应用,不过要自己来写(而且客户的这个发文还是html格式的),恐怕不是一朝一夕能搞得定的。

其实SharePoint中,这种详细的版本内容比较确实是有的,那就是在wiki页面库中,版本历史记录可以记录下两个不同版本的正文有什么区别,不过只支持wiki库的正文字段,效果是这个样子的:

image

通过跟踪源代码,发现其实在SharePoint中,这种版本对比功能已经在API中提供了接口,那就是SPDiffUtility(在Microsoft.SharePoint.Utilities命名空间中)的静态方法Diff。这个方法有三个参数,前两个参数是需要对比的两个字符串,第三个参数指定最多返回多少个差异的地方(一个int),方法返回字符串的差异结果,是一段html,样子就像是上面那张图的样子。

有了这个方法再实现起来就相对容易很多了,不过这个方法有如下两个大问题:

  1. 这个方法只支持对比html格式的字符串,对于纯文本字符串,在返回的时候,也是html格式,但是换行就无法以“换行”的形式显示出来了。
  2. 通过对这个方法进行反编译可以看到,这个方法在进行两个字符串对比的时候,是按照空格作为两个单词的分隔符(这个分隔算法是用一个整则表达式,\s+写死在代码里的),所以我们看到在中文的情况下,就会出现上图那样的状况,即使变动的只是一个字,但是系统也认为是整个段落的变动。
  3. 在SharePoint这个方法的实现中,只有“新增”和“删除”两种动作,变更的动作是通过“删除”+“新增”的方式来表示的,相对来说比较不直观。

 

第一个问题,其实解决起来很简单,把纯文本转换成html就行了,做一个HtmlEncode,然后把换行符替换为“<br/>”就行了。

第二个问题,其实说起来也很简单,在我们最终的实现方式中,是以“短句”为单位进行的对比,方法就是先对待比较的字符串进行一下处理,把几个句尾标点替换成包含空格的标记,比较完之后再替换回来:

   1: private string ChangeString(string str)
   2: {
   3:     if (str == null)
   4:        return "";
   5:     return str.Replace("。", "。`` ").Replace("!", "!`` ").Replace("?", "?`` ").Replace("、", "、`` ")
   6:         .Replace(",", ",`` ").Replace(":", ":`` ").Replace(";", ";`` ");
   7: }

比较完之后,删除里面所有的““ ”就可以了(这个序列在正常的文本中基本上不会出现),这样再调用方法的时候,替换后的部分就包含空格,可以被SharePoint识别为对比的分隔符了。

至于第三个问题,基本上没有很好的办法,不过一般客户都能够接受。

重新仿照SharePoint的方式写了一个新的页面,传入待对比的列表的ID、条目的ID和字段的名称,修改之后的结果如下图:

image

可以看到,这要比之前的那个效果好很多了。

如果希望重新定义“已删除”和“已添加”的样式,也很容易,这是两个css(ms-diffdelete和ms-diffinsert),直接修改样式表就行了。

 

Posted by on 2011 年 02 月 04 日 in SharePoint

Leave a comment

Tags:

千呼万唤始出来的VSeWSS 1.3正式版

我们都知道,在开发SharePoint应用的时候,最“著名”的一个官方的VS扩展就是VSeWSS(Visual Studio extensiont for Windows SharePoint Services),从1.0版到1.2版持续了很长一段时间,后来在一定程度上被部署、打包更加WSPBuilder所取代。之后,微软推出了1.3的CTP版本(忘了有多久了),很多WSPBuilder中的功能都在1.3版本中实现了,但遗憾的是,这个CTP似乎就这么一直下去了(CTP是英文版的,只能安装在英文版的VS 2008上,对于广大使用中文版VS的国人来说是渴望而不可及的)。甚至到SharePoint 2010、VS 2010等更先进的工具都发布之后,1.3版本依然停留在CTP阶段。直到几天前,微软终于发布了1.3的正式版,同时公布了9种语言的版本,其中,当然,包括简体中文版:

image

因为1.3版本可以自动进行WSP的打包和部署,因此需要有一个能够部署解决方案的账户,在安装过程中,就有这样的选择:

捕获

安装之后,在VS 2008中使用SharePoint相关的模板创建项目的时候,就会弹出下面这样一个窗口,询问我们是要将程序集部署在GAC中还是bin目录中:

捕获2

类似于WSPBuilder的,在项目上点击右键,会弹出相关的菜单项:

image

但同样我们也可以看到,尽管这个是微软官方推出的简体中文版,绝大多数菜单都是英文的,不过好在很少,而且对于SharePoint开发人员来讲,这些英文单词应该都是很熟悉的。如果之前用过WSPBuilder的话,可以看到,这些功能和WSPBuilder提供的功能也几乎是一样的。

和WSPBuilder有些不同的是,如果我们要向12目录中部署文件的话,需要建的文件夹不是“12”,而是叫“RootFiles”,这个和WSP结构中的RootFiles节点是对应的,在下面再新建其他内容即可(但是对FEATURES文件夹貌似并不会当成一个feature)。

image

在官方的说法中,1.3提供了如下新增功能(和1.2相比):

  • 可以在运行 SharePoint x64 的 x64 服务器操作系统计算机上安装。 以前只能使用 x86 服务器操作系统。
  • 用于打包、部署和收回的单独生成命令现在加入到 Visual Studio 菜单项中。
  • WSP 视图经过改进,能够一致地删除功能元素、合并功能,并能够向功能中添加事件接收器。
  • 包含命令行生成、打包和收回命令,可以连续地集成和生成服务器。 以前,在命令行生成 SharePoint 项目非常困难。
  • 重构 Web 部件重命名支持。 以前,重命名 Web 部件需要在项目的多个文件中进行更改。
  • 解决方案生成器现在可以从发布网站生成解决方案。 以前,只能生成普通网站。
  • 允许部分信任 Web 部件的 BIN 部署。
  • 用于 SharePoint RootFiles 项的新项目项模板。
  • 现在,部署可以在重新部署之前选择性地删除开发服务器上现有的冲突功能。 以前,任何功能名称冲突都会导致错误。
  • SharePoint 解决方案 WSP 中现在添加了辅助程序集,例如用于业务逻辑的程序集。
  • 与网站定义项目关联的隐藏功能现在显示在 WSP 视图中。 它们现在不再是隐藏的。
  • 对于高级用户,包括了快速部署功能,可以只更新 SharePoint 开发安装上的已编译程序集。
  • 包括了部署步骤日志记录。
  • 来自内容类型的列表定义模板现在允许创建列表定义事件接收器。
  • 用户指南现在随扩展插件一起安装,而不再需要单独下载。

1.3中文版的下载地址:

http://www.microsoft.com/downloads/details.aspx?FamilyID=d87523da-b5bc-4296-be8a-8e3785c8f181&displayLang=zh-cn

 

Posted by on 2010 年 12 月 23 日 in SharePoint

Leave a comment

Tags:

解决服务器上Office客户端无法在线操作文档

因为讲课的需要,经常要做各种各样的演示。

在SharePoint 2010使用默认设置全都安装在一台Windows Server 2008 R2的机器上之后,发现没办法直接用Word把文档存进文档库,也不能从文档库里面在线创建文档。

后来发现,估计是服务器端IE之类的有什么诡异安全性限制,如果想要在线打开、创建、编辑、保存文档库中的文档的话,需要在客户端里进行如下设置(以Word为例,其实都一样的):

打开那个BackStage菜单(也就是全屏的那个菜单),点击选项,点击“信任中心”,点击“信任中心设置”,选择“受保护的视图”,把所有钩都去掉:

image

这样之后,就可以在线对文档进行操作了。不过发现在服务器上直接在线打开、新建编辑文档的速度超慢无比,只要是通过WEBDAV访问的都慢到爆……一直忍了很久,直到今天忍无可忍,上网一搜,发现居然是这个东西搞的鬼:

image

嗯……这个就是IE的代理设置页面,只要把“自动监测设置”这个东西关掉,WEBDAV的速度就恢复正常了,无语。

 

Posted by on 2010 年 12 月 02 日 in SharePoint

Leave a comment

Tags: ,