2008年10月22日,星期三

我的前5个WCM提示演示

在过去的一周左右的时间里,我度过了一段愉快的时光来展示我的WCM技巧演示文稿-首先是参加UK 的SharePoint 双色球推荐一注组的创纪录的出勤率(我们首次达到200多名参加者!),然后是今天的Microsoft金牌合作伙伴。我想认为双色球推荐一注组记录的部分原因是其议程宏大,但是怀疑这确实取决于LBi的免费啤酒,比萨饼和咖喱的吸引;-)与其在幻灯片上发布一个简单的链接,我想在这里浏览信息,因为:

  1. 我可以尝试传达一些演示中的信息。
  2. 我知道 你们当中有多少人会阅读博客文章,但不遵循指向PowerPoint卡座的链接!

首先,这个演讲 不是 关于讨论标准(但很关键)的WCM主题的信息,这些天您可以轻松地找到质量信息。我个人认为,如果您要进行WCM项目,则信息的起点应该是 安德鲁·康奈尔的书 (和 他的博客文章 (如果您还没有订阅),并详细阅读一些已经发表在该主题上的关键MSDN文章(我在结尾列出了我最喜欢的资源)。在这些地方,您会发现有关一些子主题(非详尽列表)的讨论,我认为这是WCM的基础:

  • 安全
  • 辅助功能
  • 优化
  • 部署方式

因此,我的技巧不是详细介绍这些内容,而是着重介绍我发现可以成功交付WCM项目的强大技术。它们并不适合所有WCM项目,但希望它们能为您提供一些思考,并为已经存在的WCM信息提供一些额外的价值。

提示1-在双色球推荐一注控件中实现HTML标记,而不是SPD中的页面布局

说明:

不要将页面布局HTML添加到SPD中的页面布局中,而是为每个布局创建一个“父”双色球推荐一注控件,然后该双色球推荐一注控件包含该布局的HTML和子双色球推荐一注控件。这意味着您可以在SPD中的页面布局与VS Web项目中的“父级”双色球推荐一注控件之间进行一对一映射。这些父双色球推荐一注控件包含实际的标记,以及页面上使用的所有子双色球推荐一注控件。

幻灯片项目符号:

  • 更快的开发经验-更少的SPD痛苦[立即保存,而不是3-5秒的保存,以及偶尔的不必要的标记更改]
  • 现在,页面布局标记已在主要源代码管理中[与其他代码一起]
  • 更简单的更新部署[将更新部署到其他环境时,只需XCOPY双色球推荐一注控件]

看起来像什么:

因此,我们看到页面布局现在几乎没有标记(请注意,ASP ContentPlaceholder控件必须位于顶层,因此我们的父双色球推荐一注控件在PlaceholderMain中被引用):

PageLayoutMarkup

..然后,我们所有的真实标记代码都在其引用的父双色球推荐一注控件和子双色球推荐一注控件中:

UserControlMarkup

提示#2-创建指向您的Web项目文件的自定义IIS虚拟目录

说明:

我看到的大多数项目团队都将其双色球推荐一注控件置于12 / CONTROLTEMPLATES(通常位于子文件夹中)下,以便遵循SharePoint的功能。在某些技术(例如,自定义字段控件,委托控件)中,这是强制性的,但对于技巧1中讨论的WCM页面双色球推荐一注控件的类型,则不是必需的,并且有一些参数不能将其存储在12个配置单元中。总之,拥有指向VS项目的自定义IIS虚拟目录意味着 我们避免将项目文件的设计时和运行时位置分开.

幻灯片项目符号:

  • 在此处存储双色球推荐一注控件/页面家具文件(例如图片/ XSL)。删除非开发环境的代码文件(例如.cs文件)
  • 更快的开发经验–没有要复制的文件,没有构建后事件。只需保存并按F5!
  • 如果使用提示#1很重要– don’不想只为了HTML更改就编译项目(用于生成后事件以复制文件)

看起来像什么:

在我们的例子中,我们创建了一个虚拟目录,别名为“ MIW”(我们的网站名称),它指向我们的项目文件:

CustomIisVirtualDir

然后,我们所有的双色球推荐一注控件/页面家具文件路径都类似于“ /MIW/PageLayoutsControls/foo.ascx”  etc.

提示3-为网站作者/管理员简化生活[减轻他们的压力,他们会继续 您的 侧]

说明:

这是我不愿提出的非技术性提示-在我们忙于正确设置网站前端的同时,我认为值得思考的是作者/管理员将如何使用网站的后端网站(注意,这里的意思是“业务管理员”而不是IT专业人士)。尽管这可能正好体现在“政治”方面,但我主张让他们的生活尽可能轻松-他们通常在客户组织中声音很大,并且如果他们对您所建项目的反馈不好对你不利的一面。

幻灯片项目符号:

  • 考虑在以下情况下提供自定义工具:‘SharePoint way’不够简单(例如双色球推荐一注管理)
  • 如果您将自定义列表用于网站数据,请提供一个供作者查找的链接(例如,使用CustomAction)
  • 请记住,这些人很少是SharePoint专家!

看起来像什么:

显然,这对于每个项目而言都是不同的,但是对于我们的客户,我们创建了一个自定义“网站操作”子菜单,其中包含一些关键链接:

CustomSiteActionsOptions

该子菜单可导航到用于为站点供电的几个关键列表,还可以导航到我们为双色球推荐一注管理创建的一些自定义屏幕。在这里,我们还做了一些工作来简化事情,方法是结束在成员资格提供者中创建双色球推荐一注的相对复杂的过程,然后将其添加到2个站点的各个安全组中(我们有2个“姐妹” MOSS站点,这些站点都是单点登录)并将某些配置文件字段设置为一些简单的屏幕,这些屏幕提供了有关创建新双色球推荐一注后发生的情况的方便摘要:

CustomCreateUser

最后,业务管理员使用的“编辑配置文件”屏幕与最终双色球推荐一注使用的屏幕相适应,以便管理员对“配置文件向导”的每个步骤都非常熟悉,并能够更好地为双色球推荐一注提供支持。

提示#4-计划意外错误

这是一个有趣的领域,部分原因是我们在谈论“永远不会发生”但有时确实会发生的这类事情。与客户(或您自己组织内的非技术管理人员)进行对话很有趣,因为典型的响应是"whaddya表示网站会出错? ",但是熟悉软件开发原理的任何人都知道没有没有错误的软件。因此,重要的是,当这些情况发生时,我们该如何处理。

这里有几个技巧,所以我将它们分为4.1、4.2和4.3:

 提示#4.1-为404和未处理的错误实现“友好”页面

说明:

简而言之,如果网站上出现问题,面向公众的网站的双色球推荐一注将永远不会看到.Net错误!如果这曾经 确实 发生这种情况时,双色球推荐一注会觉得您的网站不可靠,可能会对组织失去信心-考虑一下,您是否还记得在amazon.com/eBay.com/microsoft.com上看到这种错误?

幻灯片项目符号:

  • 通常使用自定义HTTP模块覆盖SharePoint的默认错误处理行为,检查以下内容:
    • HttpContext.Current.Server.GetLastError()
    • HttpContext.Current.Response.StatusCode = 404

看起来像什么:

在渣打银行网站上,我们的“友好”消息如下:

CustomErrorScreen

提示#4.2-实施向开发人员发送电子邮件通知的错误

说明:

对双色球推荐一注体验进行排序是一回事,但是如何真正解决问题的根源呢?每当双色球推荐一注出现时,都会提醒其一个关键要素 确实 遇到问题,而不是依靠他们报告问题。当我第一次告诉团队我们将要实现这一目标时,我真的在考虑UAT阶段,以及上线后的关键一两周,这时您偶尔会发现一些潜在问题,这些问题一直隐藏在所有方面测试。 然而, 我们发现,在早期的开发/测试阶段,我们从中获得了更多的价值。在LBi,测试团队坐在开发团队附近,因此当Outlook“ toast”弹出时,团队却不知道该异常消息时,我会使用电子邮件中的信息进行计算哪个测试人员触发了错误,然后配备了堆栈跟踪和其他信息,大喊并询问 究竟 他们为解决问题所做的工作。比每天/每周结束时等待完整的错误报告要有效得多!

幻灯片项目符号:

  • 意味着在团队不知情的情况下不会发生错误
  • 我们将其构建用于生产,但在开发/测试中甚至更加有用!
  • 在与错误页面重定向相同的自定义HTTP模块中实现

看起来像什么:

例外电子邮件

提示#4.3-在您的代码中实现正确的跟踪

说明:

因此,对未处理的异常发出警报是一回事,但是电子邮件中的堆栈跟踪和其他详细信息通常不足以轻松地实际修复该错误。这可能是因为我们无法确切看到代码中发生了什么(例如 价值观 变量)导致错误。从生产服务器(或我们不能使用调试器的任何地方)获取此信息的唯一真实方法是在代码中添加跟踪/日志语句,启用该语句将在代码执行时写出这些详细信息。由于必须手动完成此操作,因此显然需要权衡实现该鲁棒性的时间。我强烈建议您使用代码生产力工具,例如 锐化器 (例如,超出Visual Studio代码段的范围)即可快速添加这些语句,而不必依赖于键入或复制/粘贴。

幻灯片项目符号:

  • 提供快速查找代码中的错误的功能
  • 权衡是实现的时间/精力
  • 考虑使用诸如ReSharper / CodeRush之类的生产力工具来减少影响

看起来像什么:

这显示跟踪输出与 调试视图 -注意,我已将DebugView配置为以黄色显示“警告”跟踪语句,以红色显示“错误”语句:

 TracingError

提示5-灵活设计

再次,此提示分为两个提示:

提示#5.1-使用SharePoint列表存储配置数据

说明:

正如我在演讲摘要中所说的那样,由于生活中唯一的确定性是死亡,税收和客户改变主意,因此我们应始终致力于开发一种足够灵活的解决方案,以适应可能要求我们实施的某些变更。我们可能已经习惯了存储可能在SharePoint列表中更改的站点数据的想法,但是我想将其扩展到指示站点行为的“配置”信息。我为此编写的“ 配置存储”框架可以在Codeplex上找到,网址为 www.codeplex.com/SPConfigStore -这提供了列表,内容类型,缓存和API来检索代码中的“配置项”。 因此,以我们的项目为例,我们对新创建的双色球推荐一注是否需要在首次登录时更改密码进行了切换。显然,这是我们需要在生产中启用的功能,但是在我们的测试环境中(客户端需要创建双色球推荐一注然后继续运行特定的测试脚本),这可能会很痛苦。因此,通过在SharePoint列表中进行这样的切换,我们得到的好处是,可以像更改SharePoint列表项一样轻松地更改站点的关键配置,而不是将其存储在需要存储在web.config中RDP到服务器上,打开文件,触发应用程序池回收等。

我们在“配置存储”列表中存储了130多个配置设置,当然,还应用了适当的权限,以便未经授权的双色球推荐一注无法访问该列表。

幻灯片项目符号:

  • 将SP列表用于客户端可能希望编辑的值,但可以考虑缓存

看起来像什么:

 ConfigStore

提示#5.2-实现自定义母版页类

说明:

尽管SharePoint从.Net 2.0获取母版页,但它们实际上仅用于实现一致的外观。如果要保持一致 功能性 要么 行为 在您的所有页面上,自定义母版页类都可以为您提供帮助。为此,关键是在@Master指令中修改您的母版页派生的类。我们使用这种方法来实现需要在每次页面加载时执行的代码,即使您从一开始就没有此要求,我还是建议您使用它,以便在需要时可以方便地放置此类代码。  

幻灯片项目符号:

  • 用于应该在每次页面加载时执行的任何代码
  • 我们网站上的示例:
    • 检查试用双色球推荐一注/何时终止试用
    • 检查是否接受条款& Conditions
    • Check已提供其初始双色球推荐一注个人资料信息
    • 强制使用HTTPS
  • 也可以用于显示常用检查项目的属性(例如,双色球推荐一注名,登录时间)

看起来像什么:

<%@ Master language="C#" Inherits="MyCompany.MyClient.MyProject.BasePage" %>

结论/资源

这就是我的提示,欢迎所有反馈/建议!在关键资源方面,除了AC的书以外,这里还有一些精选文章,依此类推,我建议您参考以下内容:

17条评论:

匿名 said...

提示-在跟踪示例中,您将方法的名称放入跟踪消息本身。那行得通,但是对于没有Resharper的我们来说,键入它会让我们感到痛苦(太紧了!)

或者,您可以覆盖/封装跟踪器,并使用Reflection API从StackFrame中挖掘调用对象/方法。没有听起来那么糟糕:

http://www.novolocus.com/2008/04/02/use-reflection-to-find-a-calling-method/

我还用它来封装.writeif()的级别,因此我只用以下方法跟踪内容:

trace.warning(“一些警告”;

...并提前获得Visual Studio的好处。

匿名 said...

克里斯,你好

首先,让我对演示文稿说得很好。您在谈话和演示之间取得了很好的平衡,从而出色地传达了您的资料。

关于提示#2-非常令人惊讶的是,您没有使用Web部署项目将所有双色球推荐一注控件打包到单个DLL中,然后可以将其放到bin目录或GAC中。

然后,这省去了将ascx文件放入CONTROLTEMPLATES目录的所有麻烦。此外,更重要的是,它允许您使用包含双色球推荐一注控件和测试页的标准Web项目,可以在几秒钟内运行以进行预测试。为了在SharePoint中完全测试双色球推荐一注控件,快速编译Web部署项目,将DLL放入bin或GAC,IISRESET中,然后刷新共享点页面!

另一个附加好处是开发使用自定义双色球推荐一注控件构建的自定义WebPart时。不必加载ascx模板,您只需从WebPart DLL项目中引用单个双色球推荐一注控件DLL(从WDP输出)即可。然后使用MyUserControl muc = new MyUserControl()实例化双色球推荐一注控件。

干杯,



ps-不确定在技巧1中选择的方法。请考虑一下,并可能在单独的评论中发布!

匿名 said...

这是很棒的信息。我将尝试其中的一些,并给您反馈。

匿名 said...

这些确实是非常重要的提示。关于母版页和代码,我有一个查询,如果有要求,他们希望在Internet门户上的哪个位置显示其所有站点(4个站点)的导航栏,并在单击每个选项卡时将双色球推荐一注带走到该网站的目标网页。现在,对于匿名双色球推荐一注(未登录双色球推荐一注)和已登录双色球推荐一注,此行为有所不同,我们如何实现此目的?我们如何有2个不同的登录页面,即一个用于匿名双色球推荐一注,另一个用于经过身份验证的双色球推荐一注(FBA身份验证和互联网门户)。

匿名 said...

感谢您提供一些非常有用的提示。使共享点中的wcm开发变得更容易的所有事情都非常有趣。
有人知道为什么SPD有时会突然将您的代码变成混乱,甚至是一团糟吗?
/贡纳尔

匿名 said...

See what can be done with 的SharePoint Internet sites. Top 100 examples http://www.wssdemo.com/Pages/topwebsites.aspx

克里斯·奥'Brien 说过...

嗨,安迪,

大提示。我认为将堆栈级别提高一帧可能对此很好-我认为在某一点上确实有一些跟踪代码可以做到这一点,但是我敢打赌,这会降低性能。但是,我们在此阶段并不太麻烦(嘿,我们启用了跟踪功能,所以我们有更大的问题要解决!),所以我认为这种缓解方式可以缓解。就具有将跟踪级别仅传递给方法一次的“更整洁”的形式而言,我有意不这样做,因为我偶尔希望灵活地将不同级别的内容跟踪到跟踪开关。这是非常罕见的,但我偶尔会遇到这种情况似乎有意义的情况-可能与执行实际上未跟踪的“类似跟踪”的事情有关-例如如果在文件系统上删除单独的XML文件, 任何 跟踪已启用。

最后,我仍然认为您可以从ReSharper中受益,尽管您可以将其用于各种用途。不过,您的小费是一个不错的提示。

克里斯。

克里斯·奥'Brien 说过...

丹·H

不太确定我是否了解Web部署项目在我们的特定情况下将如何提供帮助,但这可能是因为我没有广泛使用它们。我没有在演示中谈论这个,但是我们的设置如下:

-使用Web项目模板为我们提供Web项目的单个程序集(不用说,整个解决方案有许多VS项目)
-使用MSBuild脚本将运行时文件(程序集,双色球推荐一注控件,其他资产文件)复制到构建服务器
-MSBuild脚本也可以插入 XmlPreprocess 因此我们可以根据自定义VS构建类型对web.config文件进行条件处理(例如,对于“ Debug”构建,使用本地appSettings变量,对于“ QA”构建,使用适当的QA值等)
-在构建服务器上进行测试后,请执行简单的XCOPY / gacutil操作,以将其部署到QA,然后准备好其他下游环境

我们对开发的这一方面感到非常满意。 Web部署项目可能会帮助进一步简化此流程,但我可能对他们了解得还不够了解。

干杯,

克里斯。

克里斯·奥'Brien 说过...

Mossbuddy,

如果我理解正确,那么您可能有两种选择:

-编写一些代码来检查双色球推荐一注是否已通过身份验证,然后重定向到适当的登录页面(可以采用添加到顶层页面的控件的形式)
-使用诸如ASP LoginView控件之类的东西向经过身份验证/匿名的双色球推荐一注显示不同的页面内容

这是否回答你的问题?

克里斯。

匿名 said...

谢谢克里斯,我正在考虑使用自定义的PortalSiteMapProvider,该门户将具有可查询共享点列表的GetChildNodes()方法(此列表将包含用于匿名和已验证双色球推荐一注的顶部导航的各种URL的条目,因此基本上是2个链接或条目在每个标签的列表中:一个用于匿名双色球推荐一注,另一个用于经过身份验证的双色球推荐一注)。
因此,这种方式对于不同的双色球推荐一注组,全局导航将具有不同的链接。

您认为这是个好主意吗?同样,显示给匿名双色球推荐一注的页面也基于带有内容编辑器Webpart的布局,可以在需要时更改静态内容。

感谢您的建议。

匿名 said...

谢谢Chri O'Brien,这非常有帮助。您能分享一下您如何实现自定义错误消息页面吗?是显示的布局文件夹中的自定义aspx页面。我的意思是消息只是传递到品牌网站吗?不确定应如何实施,因此请问这个基本问题。谢谢。

克里斯·奥'Brien 说过...

拉胡尔

通过执行以下操作来实现自定义错误页面:

-在SharePoint中创建标准发布页面,并将错误消息文本添加到字段中
-如果发生未处理的异常,请使用HTTP模块中的代码重定向到此页面

我最近发布了一些示例代码来执行此操作 我的WCM提示演示中的示例代码.

HTH,

克里斯。

克里斯·奥'Brien 说过...

Mossbuddy,

我仍然认为可以用更少的工作来完成您要尝试做的事情-就我所知,不必编写自定义导航提供程序。

请记住,SharePoint将根据当前双色球推荐一注的权限自动“安全修剪”导航链接。因此,如果匿名双色球推荐一注无法访问某些站点区域,则他们将看不到该链接,但具有正确权限的经过身份验证的双色球推荐一注将可以看到该链接。

建议以支持您的已验证/匿名双色球推荐一注划分的方式设计站点的信息体系结构(子站点和页面的结构)。然后,您可以应用适当的权限,并让SharePoint完成其余的工作。

HTH,

克里斯。

匿名 said...

克里斯你好,

我一直在尝试博客的提示1和2,但是如果没有一些额外的步骤,将无法重现它们:

-将虚拟目录转换为IIS中的应用程序
-将程序集从Web应用程序的bin文件夹手动复制到sharepoint应用程序根目录中的bin文件夹

您对此有什么想法吗? (我们正在使用IIS7 / MOSS2007 / VS2008)

谢谢戴夫

克里斯·奥'Brien 说过...

戴夫

您当然不需要IIS虚拟目录作为应用程序-正如我在图中显示的那样,它只是我们站点中的常规虚拟目录。

在第二点上,是的,您需要将程序集复制到SharePoint Web应用程序bin文件夹(即SharePoint网站的“真实” bin文件夹)-如果您希望程序集从那里运行,则将其复制到GAC。我仍然更喜欢在VS项目上进行构建后事件来执行此操作,但是任何一种方法都可以。

HTH,

克里斯。

安迪·伯恩斯(Andy Burns) 说过...

关于第2点-删除.CS文件意味着您的双色球推荐一注控件没有落后代码-是吗?您要创建双色球推荐一注控件继承的程序集吗?

如果是这样,为什么,双色球推荐一注控件背后的代码出了什么问题?我一直看到将代码编译为程序集的说明,但我不了解其背后的原因...

(可能是一个愚蠢的问题!)

克里斯·奥'Brien 说过...

@安迪

是的,通常我所有的双色球推荐一注控件都专门放在Web项目中,因此将代码隐藏的内容编译到该程序集中。我非常喜欢这样做,因为部署的文件较少(并且可能最终以某种方式最终不同步/出现版本控制问题等)。尽管性能差异不大,但可以将其编译为相同的基础MSIL。

因此可能取决于个人喜好,但是否有令人信服的理由 是否已将所有代码预编译到程序集中?

C。

附言我甚至为我的Web项目都使用类库项目类型,然后编辑.csproj文件,以便Visual Studio为我提供“添加新双色球推荐一注控件”-我认为这是一种相当普遍的方法。