Joycode@Ab110.com

October 2006 - Posts

PHP和IIS 7.0的FastCGI模板

【原文地址】PHP and the FastCGI Module for IIS 7.0
【原文发表日期】 Tuesday, October 31, 2006 9:43 PM

过去写过几个博客帖子,都是写 IIS 7.0 是多么地酷的。我的很多帖子着重于 IIS7 给 ASP.NET 和 .NET 开发人员带来的新机遇,譬如集成的管道模型,统一的web.config 配置,集成的管理工具体验等。它真的将给开发人员开辟出巨大的机遇,以及提供给大家一个可以无限定制的web服务器。

除了着重于 .NET 开发人员的特性外,我们也在奋力实现非.NET的应用与web服务器的轻松集成。今天早些时候,主管IIS产品组的Bill Staples在本星期举行的 ZendCon PHP 大会上示范了IIS7 的一个很棒的新 FastCGI 模块:

这个秋天我们与 Zend 密切合作,来改进 IIS 对PHP的支持。通过使用这个新模块,PHP开发人员将能在 Windows 上运行时得到显著提高的性能,扩缩性和可靠性,跟老的PHP CGI模块相比,有时能快到25倍!

他们也将能与即将发行的 IIS7 的那些酷酷的新特性轻松地集成(譬如,利用输出缓存的新特性),以及与 ASP.NET 的良好集成。譬如,你可以让 ASP.NET 给一个网站提供成员和角色管理的特性,与此同时,仍然可以使用PHP编写该站的很多网页。因为在 IIS7 里,一个 ASP.NET 模块可以针对服务器的任何请求来执行,所以表单认证,角色管理以及其他特性不再局限于那些映射到ASP.NET的网址。

想进一步了解 IIS 7 的 FastCGI 模块以及如何将它来和 PHP 一起使用的话,一定要去查看一下Bill 这里的精彩教程。Rick也有一个精彩的博客帖子讨论该模块的工作原理。也一定要订阅 这里 指引的的Mike的博客以及 www.iis.net 的博客feed。

希望本文对你有所帮助,

Scott

标签: ,
关注AJAX(3):你需要知道的有关AJAX的七件事情

AJAXWorld杂志主编 Dion Hinchcliffe 不久前发表了《你需要知道的有关AJAX的七件事情(Seven Things You Need to Know About AJAX)》一文。大意如下,

1。浏览器并不适合AJAX。第一个认真的AJAX项目才开始一周,你会发现Ajax 几乎已把浏览器推向其极限。事实是,没有强有力的第三方开发工具,清晰地设计任何规模的 Javascript 软件都需要训练有素和艰苦努力才成。在多个浏览器里调试Ajax应用麻烦透顶,想要做些认真的后台或多线程更需要你使出浑身解数,特别是你想结合那些用了数目有限的计时器的其他的组件。好消息是,简单的AJAX,(譬如点缀些DHTML),比大规模的AJAX要轻松得多了。但做好准备,一旦你的应用规模加倍,随时扩大开发和测试的努力。

2。你不需要你想象中的那么多 Web 服务。我原以为走Ajax这条路需要开发许多新的Web 服务来提供数据和存储。事实上,我发现许许多多项目满足于HTML scraping或使用老式的HTTP POST。这使得尝试 Ajax 开发容易之极,可以重用任何现有的后端HTTP服务,而不是转向SOAP或REST/WOA等复杂的服务。虽然这大概会导致糟糕的架构级的选择,但这也使逐步转化到Ajax 毫不费力,简直自然之极,虽然因此造成的以后的头痛大概是难以避免的。

3。Ajax比传统Web设计和开发更棘手。HTML用户界面规范的丢失,几乎无限制的隐藏功能的可能性,编程手法创建页面元素,以及Ajax 方式的其他固有的特性把我们所知的Web设计和开发方式都扔出门外去了。 Web 设计师必须深刻理解DOM,Javascript和CSS的能力,对浏览器如何显示图像,如何布局,以及显示各种元素要有深刻理解。开发人员发现测试既困难又枯燥。虽然工具在不断地,全面地改进,但要让整个工业积累出行之有效的最佳实践,模式和实用知识,要花几年时间呢。在此要高度赞扬一下象雅虎的Bill Scott这样的业界人士,赞赏他们通过推动类似雅虎UI设计模式库这样的东西,尝试解决这里提到的许多问题,极大地推进了业界的最高工艺水平。结论是,Ajax开发,起码是目前,与传统的Web开发相比要花更多的时间,同时要求更高的技能。

4。Ajax 工具和组件仍在涌现,现今还没有明显的领先者。虽然Dojo火爆出场,但竞争远未结束。譬如,Dojo框架本身的版本还是0.3。紧随其后的种种工具,框架和组件库还有很多。虽然OpenAjax 旨在使得众多产品相互合作,大多数的开发人员只会掌握这其中的2-3个,然后就一直用这几个产品了。在目前的情形下,过早定死在某个特定的产品,一般来说不是个好主意。创新,竞争,和市场的领先地位此起彼伏,尚无定数。同时,一定要去看一下script.aculo.usPrototypeGoogle Web ToolkitYahoo! UI LibraryJackBeZapatecBindowsNexawebGeneral InterfaceBackbaseActiveWidgets,以及 微软的Atlas。还有很多别的产品,我鼓动你去看一下Max Kiesler对50个Ajax 框架的汇总简评

5。优秀的Ajax 程序员很是难找Zimbra的Scott Dietzen最近感慨找到好的Ajax人才之难。但参考上述第3点,建造复杂的Ajax 应用要求的计算机技能要远比Web设计技能多得多。我发现有经验的程序员不太喜欢Javascript编程和调试。这种情形不会持久,但也要过几年才行。

6。必须积极地对付浏览器模型对Ajax的限制。虽然最后的结果会非常值得 ,但象任何技术, Ajax远非完美,它也有几个弱点。一个是它会违反现有的Web模型,譬如,加书签,后退按钮等等。幸运的是, 象Brad Neuberg这样的有识之士对此类问题已有方案,只要你愿意花力气,理解恢复此类功能的重要性。Ajax 也缺乏桌面软件的的很多强处,譬如能离线运行,访问本地硬盘存储等,但Flash 的本地存储和即将发行的Apollo平台能应付这类问题。

7。Ajax 只是成功RIA策略的一个因素我以前也写过,如果你想让你的在线应用实现范围很广的功能,那么你必须将类似FlexOpenLaszlo, 以及WPF/E等这样的RIA平台放在考虑范围之内,特别是在想支持象音像这样丰富的媒体的情形下,而Ajax对此几乎无能为力。Ajax 会日益对这些平台造成威胁,特别是在后端服务器提供对服务器端push,Web 服务,企业环境等支持的情形下。

《SharePoint Portal Server 2003 深入指南》开放了两个章节在线阅读

感谢电子工业出版社与博文视点,《SharePoint Portal Server 2003 深入指南》现在已经在CSDN站点上开放了两个章节的免费在线阅读:《第8章 SharePoint的备份及恢复》与《第9章 Windows SharePoint Services对象模型》。您可以在这里直接阅读。

ICollection 接口的类序列化的问题。

先看一个现象:
如果你有这样的一个WebService 方法:

[WebMethod]
public void myTest(System.Collections.Specialized.NameValueCollection col)
{
.....
}

那你在请求这个WebService 方法的时候,会收到如下异常:

To be XML serializable, types which inherit from ICollection must have an implementation of Add(System.String) at all levels of their inheritance hierarchy. System.Collections.Specialized.NameValueCollection does not implement Add(System.String).

详细的错误发生点如下:
[InvalidOperationException: To be XML serializable, types which inherit from ICollection must have an implementation of Add(System.String) at all levels of their inheritance hierarchy.
System.Collections.Specialized.NameValueCollection does not implement Add(System.String).]
System.Xml.Serialization.TypeScope.GetDefaultIndexer(Type type, String memberInfo) +849
System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference) +857
System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError) +135
System.Xml.Serialization.XmlReflectionImporter.ImportMemberMapping(XmlReflec tionMember xmlReflectionMember, String ns, XmlReflectionMember[] xmlReflectionMembers, Boolean rpc, Boolean openModel) +78
System.Xml.Serialization.XmlReflectionImporter.ImportMembersMapping(XmlRefle ctionMember[] xmlReflectionMembers, String ns, Boolean hasWrapperElement, Boolean rpc, Boolean openModel) +280


这是因为对 ICollection 接口的类进行序列化的一些特殊要求:

XmlSerializer 可以以不同方式处理实现 IEnumerable 或 ICollection 的类,条件是 这些类满足某些要求,如下所示。

1、实现 IEnumerable 的类必须实现带单个参数的公共 Add 方法。Add 方法的参数必须与 从 GetEnumerator 方法返回的 IEnumerator.Current 属性所返回的类型一致(多态) 。

2、除实现 IEnumerable 外还实现 ICollection 的类(如 CollectionBase)必须有一个 值为整数的公共 Item 索引属性(在 C# 中为索引器),并且必须有一个整数类型的公 共 Count 属性。传递给 Add 方法的参数必须与从 Item 属性返回的类型相同或与该类 型的某个基的类型相同。

3、对于实现 ICollection 的类,要序列化的值将从索引的 Item 属性检索,而不是通过 调用 GetEnumerator 来检索。另外,除返回另一个集合类(实现 ICollection 的集合 类)的公共字段之外,将不序列化其他公共字段和属性。

ICollection 接口的类要可以被序列化, 该类必须包含 Add 方法和要序列化的 Item 属性(C# 索引器)。


上面的WebService 例子出现异常是因为:

NameValueCollection 并不直接实现 ICollection 接口。相反,NameValueCollection 扩展 NameObjectCollectionBase。这样,就会实现 ICollection 接口,并且在 NameValueCollection 类中不实现重载 Add(system.string) 方法。

在使用 XMLSerializer 时,XmlSerializer 尝试将 NameValueCollection 序列化或反序列化 为一般 ICollection。因此,它查找默认的 Add(System.String)。如果没有 Add(system.String) 方法,就会发生异常。

参考资料:

PRB:使用 XmlSerializer 序列化 NameValueCollection 对象时出 现“System.InvalidOperationException”错误
http://support.microsoft.com/default.aspx/kb/814187/zh-cn?spid=548&sid=304

序列化实现 ICollection 接口的类
http://msdn2.microsoft.com/zh-cn/library/58a18dwa.aspx

http://www.codecomments.com/archive321-2006-2-823224.html

http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_ 21585935.html
Windows Media Player 11 RTMed

BTW,刚才上MSDN订阅主页看到,Windows Vista和Office 2007将在七天内RTM,可以在MSDN订阅下载。哇,终于来了。

BTW2,万圣节快乐!

关注AJAX(2): 几篇有关ASP.NET AJAX的文章

1。Brad Abrams 的

Search autocomplete with ASP.NET AJAX Extensions
http://blogs.msdn.com/brada/archive/2006/10/27/search-autocomplete-with-asp-net-ajax-extensions.aspx

使用ASP.NET 2.0 profile store 和ASP.NET AJAX AutoCompleteExtender实现提示查询字符串

2。[来源:Kirk Allen Evans] UpdatePanel开发人员Eilon Lipton写的2篇关于UpdatePanel的帖子

What's up with UpdatePanels and how come nothing works?
http://forums.asp.net/thread/1440058.aspx

UpdatePanel中最大的变动是在局部更新情形下异步提交中的脚本注册。在早期CTP版本中使用的机制只对简单的情形适用,在复杂的情形下,譬如UpdatePanel中带有一个向导(Wizard)控件的情形,无法在客户端从页面上去掉控件,导致内存泄漏。在ASP.NET AJAX Extensions 1.0 beta版本中,引人了显式注册脚本的模型,这样UpdatePanel知道什么时候该执行什么脚本。ScriptManager多了几个静态的脚本注册方法。

你以前这么调用,

Page.ClientScript.RegisterClientScriptBlock(typeof(Foo), "key", "alert('hello'); ", true);

但现在应该这么调用,

ScriptManager.RegisterClientScriptBlock(this, typeof(Foo), "key", "alert('hello');", true);

通过这些方法的第一个控件参数,可以判断出注册脚本的这个控件是否包含在UpdatePanel内,如果是的话,在异步更新中,可以决定那个UpdatePanel是否就是当前这个正在更新的UpdatePanel。同时这个控件需要实现dispose逻辑,这样,当UpdatePanel在更新时,清除其内容时,可以调用这些脚本“拆除”所用资源。

可能造成的最大问题是,现有的控件,如果它们注册脚本的话,在UpdatePanel内就不工作了,ATLAS产品组知道这个问题,但为长远计,认为这个改动是必须的。

UpdatePanel内会注册脚本的最常用的控件大概是验证控件,所以这些控件都被更新了,即是Microsoft.Web.UI.Compatibility 命名空间下的那些控件,而且在web.config通过tagMapping的机制把原来的验证控件映射到这些新的控件了。在将来,其他注册脚本的控件也会被更新。

 

Buying Into Microsoft ASP.NET AJAX without Necessarily Paying For It
http://forums.asp.net/thread/1445844.aspx

通过反射,编写ASP.NET AJAX-Aware的控件,既能在有ASP.NET AJAX 的情形下,也能在没有ASP.NET AJAX 的情形下使用。为什么要编写ASP.NET AJAX-Aware 控件?因为如果一个控件要存活在UpdatePanel中,

  1. 它需要通过ScriptManager的脚本注册API,而不是使用 Page.ClientScript API。这些新旧API间有一一对应的关系。
  2. 如果该控件配属事件处理函数的话,那么该控件必须实现dispose功能。
  3. 该控件注册的脚本需要分成2个部分:1。脚本库代码,只包含函数和类定义,为该控件的所有实例共享;2。该控件的初始化代码,每个实例各不相同

 

作者提供了一个实例,对如何注册脚本做了详细的介绍。

 

3。Hannes Preishuber

ASP.NET AJAX JSON Date serialization
http://weblogs.asp.net/hpreishuber/archive/2006/10/29/ASP.NET-AJAX-JSON-Date-serialization.aspx

作者发现日期的JSON序列化是 "@977612400000@" 的形式, Sys.Serialization.JavaScriptSerializer.deserialize 使用了正则表达式来反向序列化,不如他的 split/ParseInt/new Date 的效率高。几个月前,Nikhil Kothari 曾提议把日期在JSON中序列化为 @04/15/2006@ ,或 @04/15/2006 12:00:00 PM@ 的形式。

关注AJAX (1):AJAX框架的竞争将在UI widgets层展开

[来源:Brad Abrams ]

在近期举行的 AJAX 体验大会上, jQuery 的作者John Resig 提出了选择一个AJAX框架的标准,主要在文档,社区支持,下载文件大小和受欢迎程度四个方面,而在技术上,则在DOM,Events, Animations,AJAX方面比较。微软Atlas 产品组的主管 Brad Abrams他的博客里指出,ASP.NET AJAX框架在文档,社区支持,下载文件大小和受欢迎程度上可以和任何AJAX框架匹敌。John Resig 对此回复说,

I'd classify the Microsoft Ajax Library as having:
- Moderate DOM Traversal, only basic get by ID - no apparent DOM creation methods.
- Acceptable DOM Events.
- Good Ajax Support.
- No Animation Support.(注:其实ASP.NET AJAX有动画支持)

....Even with just the better DOM support the library would already be ahead of Prototype in directly useful functionality....

Brad Abrams的博客里还指出了几个有意思的地方,

  • 基本的 XmlHttp 抽象和 JavaScript 语言扩展大家都做得差不多了,有区别也不是很大。真正的竞争将在UI widgets层次上展开,有意思的是,这些UI widgets 是不大容易从一个框架移植到另一个框架的,在接下来的6个月至1年内,框架的与众不同之处将渐渐展现出来。
  • 有人指出“Better is Simpler”,应该是指AJAX的易用性,surface area小,而且更加直观。
  • 在客户端和服务器端之间的平衡。AJAX 模型把焦点从一个项目UI模型转移到更着重于应用层次服务的集成。ASP.NET 和Atlas的结合是绝配。
  • 性能随应用场景而变,没有绝对的答案,应该测量的是用户对性能的感觉(user perception of performance),而不是raw throughput。
  • 在用户点击提交按钮前把数据传回服务器,不纯是一个技术性的问题,而是用户的感知模型的问题,因为用户根据以往体验的理解是,在点击提交前,数据是不应该记录的。
技巧和诀窍:用ASP.NET AJAX来处理UpdatePanel控件的出错

【原文地址】Tip/Trick: Handling Errors with the UpdatePanel control using ASP.NET AJAX
【原文发表日期】 Sunday, October 29, 2006 6:56 PM

Luis Abreu是ASP.NET MVP,在 http://msmvps.com 博客站上拥有一个精彩的博客。今天早些时候,他贴了一篇精彩的教程帖子,描述如何使用ASP.NET AJAX Beta1版中的一些新特性,来给你的应用添加更健壮(robust)的出错处理。我强烈推荐你去阅读以及为将来之用而收藏它。

在AJAX世界里处理错误经常会相当棘手,特别当AJAX回调正在进行,应用中客户端和服务器端的编码混合着运行的时候。在最新的版本中,ASP.NET AJAX中的 <asp:updatepanel> 控件现在拥有更健壮的处理错误和报告错误的特性可以为你所用。具体来说,

1) 你现在可以在 <asp:scriptmanager> 控件上处理OnAsyncPostBackError事件,来捕捉和/或修改在服务器端处理AJAX postback回调时发生的错误消息。

2) 你现在可以在 <asp:scriptmanager> 控件上设置AllowCustomErrors属性,启动标准的 ASP.NET 自定义出错支持,在错误反生时,即使这个错误是在AJAX postback 中发生的,可以把用户自动重新定向到一个错误页面。

3) 你现在也可以在页面上选择处理客户端的JavaScript事件来拦截任何从服务器端发回的错误消息,从而来执行自定义的客户端行为。譬如,不是跳出一个消息对话框,而是把错误消息输出到一个格式好看的 <div> 区去。

去这里阅读Luis的精彩教程来了解一下如何利用上述这些新特性吧。

希望本文对你有所帮助,

Scott

寻求SPPS开发合作伙伴
开心见谅,在此寻觅一个熟悉SPPS的合作伙伴。 今有一项目涉及到SPPS,寻觅合作伙伴。 要求: 1、熟悉SPPS 2003的架构,能熟练在其基础上进行开发以及整合动作。 2、良好的客户沟通能力,能比较清晰的捕获客户需求,能撰写良好的SA文档 酬劳:请按人天报价 有效期:2006/11/1之前 联系: MSN: uestc95@263.net PS:Blog不支持IE7,没有了格式化,见谅。
如何在SharePoint Server中整合其他应用系统?

说到在SharePoint Server中整合其他应用系统,其实是一个挺复杂的问题,需要考量多方面的问题,并在各种选项中做出最佳的选择。在这篇blog中,将SharePoint Server在整合这方面的方法比较系统的描述一下,希望对大家有帮助。这篇blog里面说的SharePoint Server是泛指,并不针对特定的SharePoint Portal Server 2003或Office SharePoint Server 2007。

看到这里,可能会有朋友问了,整合应用系统?这不是BizTalk Server应该干的活吗?是的,EAI(企业应用集成)正是BizTalk Server的强项。但是首先,BizTalk Server更擅长的在应用层对各个应用和系统进行整合,也就是说,BizTalk Server和各个系统打交道的方式大多数是通过这些系统的各种API,而在很多场合我们除了在应用层需要对各个系统进行整合之外,我们还希望在界面上对各个应用也能有整合,也即展现层的整合,展现层的整合能够让用户在一个统一的界面上访问和操作多个应用系统,看到各个系统中的信息。对于展现层的整合,我们同样需要有一个基于Web的平台来干这个,而这就是SharePoint Server的强项了。

其次,很多时候我们可能不一定需要BizTalk Server这样的“重型武器”,在文章的后面我们会看到,只有在某些复杂的场合,更确切的说,是客户已经有了较多的应用,而且各个应用间的确有互联、整合、集成的需求,才有BizTalk Server的用武之地。

一般,我们将SharePoint Server的应用整合方式分为下面的四种(下面的图片摘自PPT,所以非常抱歉比较大):



第一种:基于Web界面的整合

这种方式简单来说,就是直接把其他系统的Web界面直接拿过来,放到SharePoint Server的页面上去,让用户可以在SharePoint这一个界面里面能够访问到其他系统。

这种方式是几种整合方式中最简单的一种,但是简单并不意味着不实用,有的时候,基于Web界面的整合可能就是最好,也是最省事的方法。使用这个方法有一个先决条件,就是要整合的应用必须有Web展现,否则就无从谈起了,幸好现在是一个Web大行其道的年代,几乎大部分企业应用系统都是通过Web方式展现给客户的。

SharePoint Portal Server 2003中已经提供了两个现成的Web Part,来帮助我们完成基于Web界面的整合。第一个是网页查看器Web Part,给它一个URL,它能把指定的页面以IFrame的方式直接嵌到SharePoint页面中。另外一个是网页截取器Web Part,它能让我们指定一个网页中的一个部分,然后它会自动把这个部分截取下来,显示在SharePoint页面中,而且我们还能指定一个更新周期,这个Web Part会隔一段时间就检测指定的网页是否发生的变化,然后更新要显示的网页部分块。

当然,除了使用SharePoint自带的Web Part之外,我们还可以用自己的方式,来进行这种进行Web界面的整合。只要你的方法基本原理是将另外一个应用系统的Web界面弄到SharePoint里面,那么就应该属于这第一种方法。

使用基于Web界面的整合可能遇到的一大挑战就是单点登录(SSO),因为要整合的那个Web应用很可能是需要登录后才能访问的,而用户显然不希望在SharePoint里面查看另外一个应用系统的信息时,还需要再登录一次,所以我们需要帮助用户来自动完成这个登录过程。

第二种:基于数据源的整合

由于某种原因,比如要整合的系统根本就没有Web展现,或者SSO不好做,难以整合,同时用户也只需要能够在SharePoint里面看到那个系统里面的数据而已,并不需要做什么交互操作(比如,客户只需要看到上个月的销售数据报表,或者客户信息表),而且我们也可以直接访问到要整合的系统的数据库,那么用这第二种方法也许是一个不错的主意。

基于数据源的整合,就是直接去连接要整合系统的数据库,然后利用某些Web Part将一个表、或者多个表的数据直接展现出来。SharePoint提供了现成了Web Part,允许我们使用ODBC方式去连接任何数据库,然后把数据展现在SharePoint页面上。当然,自己做一个定制的展现数据库数据的Web Part也并不是一件难事。

这种方法的一个重要好处是,你根本不需要考虑那个应用系统是怎么做的、如何做的、接口是什么,只要你能访问到它的数据库,就能搞定。

基于数据源的整合有一个重要的前提条件,就是你知道要整合的系统数据库在哪、如何访问,以及了解它的数据库结构(数据字典),就是说,你要清楚的知道,应该将哪个Database的哪个Table的哪些Field的数据展现出来,才是客户想看到的数据。

第三种:点对点的整合

点对点的整合是指,让开发人员开发出定制的Web Part,在Web Part的代码里面,访问要整合的系统的特定的API(可能是各种类型的,比如Web Service,或者对象模型),以在Web Part里面来完成某件任务。由于可能需要针对每一个应用系统,甚至应用系统中的每一项功能,来开发出一个对应的Web Part,所以这种方法被成为点对点的方法。

点对点整合可以带来最大的灵活性和最大的功能性,因为只要其他的应用系统带有相应的接口,我们就可以在Web Part里面完成任意的功能:从其他应用系统中获取数据、与其他应用系统进行交互操作,等等。

但这种方法也有自己的前提。首先,要整合的应用系统必须有相应的接口,如果面对一个根本就没有考虑过被第三方访问,根本没有设计任何API的应用,那就没法子了(这种类型的应用系统并不少见!)。其次,如果有API,Web Part开发人员还需要了解这些API,知道怎么调用,调用哪个才是自己需要的,有很多应用系统是非常复杂的,提供了庞大繁杂的API,如果不熟悉这些应用系统的接口,学习成本还是不小的。

点对点整合的一个典型例子就是专门访问SAP系统的SAP iView Web Part Toolkit,另外,对于如何将SAP整合到SharePoint里面,这个网站是非常有价值的:www.microsoft-sap.com/interop.aspx

第四种:应用集成方式的整合

终于,在面对最复杂的场景,我们要用上BizTalk Server这样的EAI服务器了。如果我们需要整合多个系统,比如在一个Web Part里面能够操作多个系统按照某个流程完成某项任务,那么使用这种整合方式应该是最合适的了。

在这种方式里面,我们需要有一台专门的应用集成与整合服务器,通过它与各个应用系统打交道,在它上面完成业务流程的编制和创建,然后通过在Web Part中调用这个应用集成与整合服务器的接口,来完成整合功能。

OK,现在,我就将最常见的四种整合方式介绍完了,最后,我想让大家了解一下Office SharePoint Server 2007中提供的一个新的,用于进行应用整合的组件:Business Data Catalog。



上面的图片(同样摘自某张PPT,所以再次抱歉图片较大)展示了BDC的整体架构和作用。BDC提供了一种中间层,在这个中间层里面,我们可以定义出数据的Metadata,然后BDC会根据Metadata,从后台的应用系统中将相应的数据抽取上来,以供SharePoint Server使用。

在BDC中,我们首先可以定义Application,Application基本对应于应用系统,然后,我们可以在一个Application中定义多个Entity(实体,比如“客户”、“员工”),基于Entity,我们可以再定义它的属性、方法、动作。将这些Metadata定义好了之后,BDC就能够透过两种方式根据Metadata从后端应用系统中得到这些Entity的数据:一种是使用ADO.NET直接去访问数据库,一种是去访问后端应用系统的Web Service接口。

BDC从后端应用系统中将定义好的数据抽取上来之后,SharePoint Server 2007中有自带的Web Part能够直接显示这些数据,而且可以对这些数据进行过滤查询等等,另外,SharePoint Server 2007的搜索引擎可以将BDC数据作为内容源进行检索,这样,SharePoint Server 2007无形中就实现了对业务系统的数据搜索功能了。当然,BDC也提供了完善的API,让我们能够在自己的应用或者Web Part里面访问BDC中抽取出来的数据,或者将更新的数据写回到后端应用系统中。

BDC的出现,大大扩展了SharePoint Server对第三方应用系统的整合能力,通过BDC,大大简化了对后端业务系统中的数据访问、操作、搜索。关于BDC的更详细信息,请参考SharePoint Server 2007 SDK里面的相关内容

Realize .NET Potential (中文版) 2.0
从2006年10月29日开始,我的Realize .NET Potential (中文版)博客进入2.0阶段。 压缩数量,提高质量。 减少随笔,增加文章。 随笔或者文章发布一周后,随时关闭评论功能。 ------------------------------------------------------------ 一年多前在天道酬勤:之读后感中提到的郑全战博士现在已经成为腾讯首席架构师。预祝全战能取得更多成功!
CSS控件适配器更新 (Beta3)
【原文地址】CSS Control Adapters Update (Beta3)
【原文发表日期】 Saturday, October 28, 2006 2:06 PM

以前在博客里写过 Russ 和 Heidi 在开发的这些很棒的CSS控件适配器。这些适配器使用了一个ASP.NET 2.0中称为“control adapters”的内置扩展机制,允许你接入任何 ASP.NET 服务器端控件,覆盖(override),修改(modify),或细调(tweak )控件的显示输出逻辑。

Russ 和 Heidi 开发的这些控件适配器对所有的ASP.NET数据控件(GridView,DataList, DetailsView,FormView等),导航控件(Menu,TreeView),登录控件 (Login,CreateUserWizard, ChangePassword,PasswordRecovery,LoginStatus) 提供了一个基于纯CSS(而不是表格)的显示机制。

你可以从我以前的教程博客帖子这里进一步了解这些控件以及了解如何在你的项目里使用这些控件。

控件适配器Beta3的发布

这个星期早些时候,我们发布了CSS控件适配器的Beta3版本,在其中我们融入了更多的反馈和建议,还添加了许多新特性。下面对几个既新又酷的特性提供了快捷指引:

  • 打开 Menu(菜单) 例子,增加你的浏览器的字体大小,在IE里使用查看->文字大小->更大。
  • 打开 CreateUserWizard 例子,使用accesskey来导航。如果在Windows下,按 Alt + e 把焦点设置在Email地址文本框里。(在IE里,对密码文本框,你必须同时按下Shift键才能使用对应的accesskey)。
  • 试用一下重新设计的 TreeView 例子。展开树的几个节点,选择一个节点造成页面提交。注意到没有,树保持了展开的节点的状态,对被选择的节点做了可见的标记,同时用它的值改动了页面中的内容。
  • 玩一下级联复选框(cascading checkboxe)
  • 验证这些页面遵从XHTML 1.1严格标准。

你可以在 http://www.asp.net/cssadapters 这个网站上进一步了解以及下载免费的CSS控件适配器(内含VB和C#2个版本的源码)。

希望本文对你有所帮助,

Scott

标签: ,
Building Browser Helper Objects with Visual Studio 2005

尽管BHO被给与了太多的权限,以至于很多反恶意软件对BHO倍加关注,但是很多BHO也是很有用的,例如Google ToolBarInternet Explorer Developer Toolbar。在Windows XP SP2中,微软在IE中加入了加载项管理器来管理包含BHO在内的浏览器扩展。

微软在1999年1月发布了一篇名为Browser Helper Objects: The Browser the Way You Want It的文章,同时在微软知识库中也提供了一个示例IEHelper,这使得编写BHO的难度大大降低,但是这也使得有缺陷的BHO的数量增加。甚至在最近这篇文章Building Browser Helper Objects with Visual Studio 2005的示例代码中,也有着一些缺陷,但是这篇文章也详尽地阐述了编写BHO需要注意的事项,编写BHO的程序员应该去看一看。

文中的RGS应该从

HKLM {
  SOFTWARE {
    Microsoft {
      Windows {
        CurrentVersion {
          Explorer {
            'Browser Helper Objects' {
              ForceRemove '{D2F7E1E3-C9DC-4349-B72C-D5A708D6DD77}' = s
'HelloWorldBHO' {
                val 'NoExplorer' = d '1'
              }
            }
          }
        }
      }
    }
  }
}

改为

HKLM {
  NoRemove SOFTWARE {
    NoRemove Microsoft {
      NoRemove Windows {
        NoRemove CurrentVersion {
          NoRemove Explorer {
            NoRemove 'Browser Helper Objects' {
              ForceRemove '{D2F7E1E3-C9DC-4349-B72C-D5A708D6DD77}' = s
'HelloWorldBHO' {
                val 'NoExplorer' = d '1'
              }
            }
          }
        }
      }
    }
  }
}

public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2,
&LIBID_SHDocVw, 1, 0>

应该改为

public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2,
&LIBID_SHDocVw, 1, 1>

If the page has no frames, the event is fired once after the page is ready, but before any script has run.这句话有误,浏览器在下载到BODY内嵌的script标签的时候就会执行脚本。

those that fire DownloadBegin will also fire a corresponding DocumentComplete 这里DocumentComplete 应该是DownloadComplete。

博客堂的后台对IE7支持似乎不甚完善,编辑的时候格式化功能不见了,用IE6才发得上来

vbScript 中读写各种编码的文件

我们使用 FileSystemObject 对象创建文件时候,由于这是个早期版本,你想创建一个utf-8编码的文件,或者读取时候,很容易出现乱码。这时候,你可以使用 ADODB.Stream 对象:

下面的代码就是一个简单的vbScript例子,

把C:\Logs\ 目录下的所有文件和并到一个568.txt 文件:

Function LoadFile(Path)
    Dim Stm2
    Set Stm2 = CreateObject("ADODB.Stream")
    Stm2.Type = 2
    Stm2.Mode = 3
    Stm2.Open

    Stm2.LoadFromFile Path
    'Stm2.Charset = "UTF-8"
    'Stm2.Charset = "Unicode"
    Stm2.Charset = "GB2312"
    
    Stm2.position = 0
    LoadFile = Stm2.ReadText
    Stm2.Close
    Set Stm2 = nothing
End Function

    Dim Stm1
    Set Stm1 = CreateObject("ADODB.Stream")
    Stm1.Type = 2
    Stm1.Open
    'Stm1.Charset = "UTF-8"
    Stm1.Charset = "Unicode"
    Stm1.Position = Stm1.Size

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder("C:\Logs\")
Set fc = f.Files

For Each f1 in fc
    'Wscript.Echo f1.name
   Message = LoadFile("C:\Logs\"&f1.name)
   'Wscript.Echo Message
   Stm1.WriteText Message
Next
set fc = nothing
set f = nothing
set fso = nothing


    Stm1.SaveToFile "568.txt",2
    Stm1.Close
    set Stm1 = nothing

注意:你需要根据你自己对应文件夹下文件的编码,设置ADODB.Stream 对象的 Charset 属性。

我就是在这个代码例子基础上,把我对数据库的每个表、存储过程定义的sql,合并为一个文件,这样,我可以在每次需要发布的时候,执行一边这个脚本,就自动产生需要发布的sql语句集合了。

附:

FileSystemObject 对象的创建文件说明
object.CreateTextFile(filename[, overwrite[, unicode]])

unicode 可选项。Boolean 值,指明文件是否以 Unicode 或 ASCII 文件方式创建。如果文件作为 Unicode 文件创建,则值为 true ,如果作为 ASCII 文件创建,则为 false。如果忽略,则假定为 ASCII 文件。

Visual Studio Extensions for SharePoint Services, Really Cool !

什么是Visual Studio Extensions for SharePoint Services?不妨Google一下。从下面的几张PPT截图,你也可以略为了解一二:



More Posts Next page »