RSS

Monthly Archives: 三月 2005

第一个Indigo Service

我第一次尝试Indigo,是使用的VS 2005 PD6 + Indigo SDR2.0.40903)这个版本,那个SDR的版本和现在公开发布的CTP版本已经有不少的差别了。现在我已经把我的Indigo运行环境更新到了VS2005 PD78.0.50110.30,也就是公开的Feb CTP版本) + Indigo CTP2.0.50110.20),这两个版本能够非常好的一起工作。但是注意,现在的这个Indigo CTP是不能在即将发布的VS2005 Beta2上跑的,而当VS2005 Beta2发布的时候,预计Indigo也会相应的发布一个配套的版本。

 

在谈到更具体的话题之前,先说说什么是Indigo?最官方的答案是:“Indigo是一组用于构建和运行Connected System.Net技术集合,是用于构建面向服务系统的通讯基础组件”。如果要具有“煽动性”一些,那么可以用这样的话:“Indigo是在未来打算接管.ASMX WebServiceWSERemotingDCOMMSMQ等分布式系统通讯组件的东东”。

 

OK,我们先来接触一下Indigo的几个非常重要的概念术语,我希望用尽可能短的描述来让大家对这些术语有一个清晰的了解:

 

Service:一个服务,我们下面要演示的就是要创建一个Indigo Service

Operation:每个Service都包含一个或多个OperationOperation就是Service能做的事情。

Service Contract:用来描述服务的契约,Service ContractService用来向Client介绍和说明自己的手段,Client要调用Service,需要先了解Service Contract

Service UriServiceUri,要让Client能找到ServiceService就要有一个Uri公布出去。

EndpointService公开的“端口”,Client通过这些Endpoint连接到Service,一个Service可以有一个或多个Endpoint

Endpoint AddressEndpoint的地址,Service Uri + Endpoint Address,最终组成了Client连接此Endpoint的全地址。

Endpoint BindingEndpoint所采用的网络协议、通讯方式、信息编码格式等,Indigo内置了一些标准的Binding,比如:WsProfileBinding是采用http/https、文本编码的一种BindingNetProfileTcpBinding是采用Tcp、二进制编码的一种Binding

 

对于每个Service,都需要有一个Host(中文常翻译为宿主)。Indigo支持多种Host形式,当前的Indigo CTPWinXP/Win2003上支持IIS-HostSelf-Host,而在Longhorn平台上则还支持更佳的WAS-HostIIS7-HostIIS-Host类似于现在的.ASMX WebService,由IIS管理,Self-Host则是通过代码创建一个ServiceHost对象,让任意类型的程序(ConsoleWinForms…)都能成为Host。推荐大家在可能的情况下采用IIS-Host,因为这样可以得到IIS自带的自动回收进程、进程监视等优点。当然,在需要使用更高效率的Tcp协议通讯/二进制编码信息的场合,就需要用到Self-Host了,我们可以通过创建一个Indigo Windows Service来实现不间断的服务。

 

IndigoEndpoint的设定支持配置文件的方式,而且也推荐使用配置文件的方式,而不要硬编码。这样,当我们需要让现有的普通采用Http协议/文本编码配置的Indigo Service改为另外一种协议或编码时,就只需要更改配置文件中的配置即可。

 

OK,下面我们开始真正的编码。我们首先创建一个Indigo Service

 

VS2005中新建一个ASP.NET项目,然后在项目里面增加一个类(VS2005应该会自动提示我们将文件放置到App_Code目录下):

 

[ServiceContract]

public class MathService

{

       [OperationContract]

       public Int32 Add(Int32 value1, Int32 value2)

       {

              return value1 + value2;

       }

}

 

如上,我们建立了一个Service Contract,在这个Service里面有一个Operation,叫做Add。然后,我们在站点根目录建立一个MathService.svc文件,内容如下:

 

<%@Service class=”MathService” Debug=”true” language=”cs”%>

 

然后我们在web.config里面加上Indigo的配置:

 

<system.serviceModel>

    <services>

      <service serviceType=”MathService”>

        <endpoint contractType=”MathService” address=”Ep1″

          bindingSectionName=”basicProfileBinding”/>

      </service>

    </services>

</system.serviceModel>

 

如上,我们给Service建立了一个Endpoint,这个EndpointAddressEp1Binding使用了Indigo自带的basicProfileBinding

 

编译一下项目确定没有问题以后,我们可以打开IE,浏览一下:http://localhost/MathService/MathService.svc/Ep1(这个Web项目在我的电脑上的虚拟目录是http://localhost/MathService),应该可以看到Indigo服务的一些信息。

 

第二步是创建一个Client,我们使用VS2005创建一个Console项目。在这里,我们需要用到一个Indigo自带的工具:SvcUtil,它可以帮我们自动创建一个Service Proxy文件,里面将我们调用Indigo Service所需要的接口和类创建好。

 

我们执行:SvcUtil “http://localhost/MathService/MathService.svc/Ep1” /config:app.config

 

SvcUtil会自动创建一个文件名称为tempuri.org.csProxy文件,将这个文件加入到项目中。第二个参数“/config:app.config”是让SvcUtil自动将所需的Indigo配置写入到app.config中,省去我们手写的麻烦。

 

现在我们可以在Main()里面直接编码了,调用的代码非常简单:

 

MathServiceProxy proxy = new MathServiceProxy(“MathService”);

Console.WriteLine(proxy.Add(1, 2));

 

运行这个程序,我们就可以看到正确的返回结果“3”。J

 

OK,我们用非常快的速度完成了一个Indigo Service和一个Indigo Client的编写。你可能觉得Indigo Service好像和Web Service没什么两样,其实他们的差别是非常大的,在以后的文章里面,我会不断的展示Indigo的各种Cool Feature

 

Posted by on 2005/03/31 in 未分类

9 Comments

Tags:

Contract-First, the key of Service-Oriented

说到“Contract-First”,那么就首先要补充一下这一句:“Services share schema and contract, not class”。

Contract-First绝对是设计Service-Oriented系统中最重要的原则和理念之一。如果要动手做一个Service-Oriented的东东,首先要领会的关键之一,就是Contract-First。Service对外公开的接口,应当就是一个Contract,这个Contract的作用就像是它自己对外说明:“我能够提供哪些哪些服务,这些服务需要哪些哪些参数,会返回哪些哪些值…”如果服务间需要传递数据,那么也需要有Service和Client端公认的Contract,这个Contract用来说明:“我们要传递的这个数据,第一项是一个字符串用来包含姓名信息的,第二项是一个整数,包含了一个年龄信息…”由于Service间通常都会用SOAP包来交流,对于SOAP包的编码格式等信息,也需要用Contract来说明。

虽然已经有N多人在跟帖说“WebService != SOA”,但我还是要先拿WebService来说事儿。如何用Contract-First的概念来构建一个WebService呢?我们需要首先定义用来交换的数据的Contract(Data Contract),xsd就是用来定义数据Schema的。然后,我们再来定义Service和Client间进行通信的消息的Contract(Message Contract),别忘了Messsage-Based是Service-Oriented的基本特点之一。接着,根据这些由xsd来定义的Data Contract和Message Contract,生成我们的描述文件wsdl。wsdl描述了Service的接口和其用到的数据结构。从wsdl,我们就可以生成用来支持开发的实际的类代码文件了。

可以看出,Contract-First的设计理念和平时我们用来构建WebService的方式大相径庭。Contract-First的观点是需要首先确定Service与Client进行交互的各种Contract,数据的、消息的、接口的,而不是我们先把实际的类代码写出来,然后给它加上“[WebMethod]”,使其成为WebService接口。

WSCF是一个支持Contract-First理念设计WebService的工具,它是VS.NET的一个插件,可以非常方便的支持上面所描述的方式和步骤,来构建WebService。

使用Contract-First构建WebService的好处,就是Contract是独立的、可移植的、脱离于代码的。由于我们可以使用xsd来描述Contract,所以只需要和其他Service共享这些xsd描述文件,那么Service间就能共享这些Contract。我们不再需要让另外的Service去引用包含了Person实体对象的程序集,才能达到对方Service能交换Person数据的目的。相反,我们只需要共享出描述了Person结构的Data Contract给对方Service,即使对方Service可能是用Java实现的,它们也能根据这些Data Contract在它们的平台上生成实际的支持代码,并以符合Contract的方式来和本地的Service交换Person数据。

下面的截图出自WSCF:

定义的Data Contract:

定义的Message Contract:

Contract是由xsd文件来描述的:

最后,由Contract,自动生成WSDL描述文件,然后从WSDL生成实际的支持代码:

可以看到,上面的方式完全不同于传统的代码->加上[WebMethod]->自动由.asmx?wsdl生成wsdl等步骤。

说了这么多,再把目光投向Indigo。Indigo已经发布了第一个公开的CTP版本,所以也是时候开始在Blog里面写写Indigo了。Indigo是微软用于构建Connected System的一个开发框架,整个架构都非常符合Service-Oriented的理念。所以,Contract-First同样也是Indigo的基本概念之一。

下面是Indigo里面的一个Data Contract示例,Indigo里面使用[DataContractAttribute]来标识Data Contract:

[DataContract]
public class Person
{
   [DataMember]
   public String Name;
   [DataMember]
   public DateTime Birthday;
}

下面就是一个Indigo Service接口示例,同样是使用了Attribute来标识Service Contract,和Service Contract中所包含的Service Operation:

[ServiceContract]
public interface IPersonService
{
   [OperationContract]
   Person GetPerson(String name);
   [OperationContract]
   void UpdatePerson(Person person);
}

public class PersonService : IPersonService
{
   …
}

下篇Blog将会专门介绍Indigo。

 

Posted by on 2005/03/19 in 未分类

4 Comments

Tags:

I believe .Net !

最近Richard Grimes的一篇文章,把.Net社区搅弄了一番,CSDN也将这个新闻放在了首页上。博客园也有人发了一篇帖子,表示了自己对.Net的疑问。

Visual C#的产品经理Dan Fernandez则在他的Blog上发表了一篇文章,逐条的反驳了Richard Grimes的观点。那么我也凑凑热闹,来讲一讲自己的观点,为什么Microsoft不做某些看起来“理所当然”的事情。

一、Microsoft对.Net没有信心吗?

恰恰相反,Microsoft相对IBM、SUN最大的不同就是,如果Microsoft认准的方向,会将整个Microsoft全部“押”上去,投入所有的力量,尽最大的努力做到最好。从DOS到Windows,从Win32到.Net,无不是如此。不管是IBM,还是SUN,在推广某项技术的同时,总会“留上一手”,以免“万一不利”的时候,还有备选方案,或者能够避免让整个公司受损。看起来似乎很“安全”,但是,如果连公司自己都没有“决一死战”的信心和勇气,还能指望消费者能相信自己吗?

当Lotus、WordStar领先于办公套件市场时,当几乎所有上网的人都使用Netscape时,当OS/2号称将取代DOS和Windows时,当Java似乎要将所有程序员吸引过去时,如果没有“决一死战”的信心,没有将整个公司“押”上去的勇气,你认为,Microsoft能走到今天吗?

二、为什么Microsoft自己不将所有现有产品都彻底用.Net改写掉?

一家软件公司最愚蠢的事情之一,就是公司的管理层听信了开发人员的下面这句话:“天哪,旧版本的代码简直就是垃圾,我们唯一的选择就是重头设计一个全新的系统,用最棒的技术来构建!”无数软件公司都是死在了这句话之下。

Netscape的管理层就曾经听信过开发人员的话,用全新的代码去构建Netscape的下一个版本,而不是基于旧版本进行逐步的升级。最后,似乎永远无法Release的全新版本,把Netscape彻底拖死了…

三、但是,“纯粹”的.Net,多激动人心呀!

嗯,有个专门的术语,叫做“The Myth of .NET Purity”(纯血统.Net神话),请先阅读这篇文章。我们生活在一个真实的世界,在这个世界中,已经有大量的使用Win32 API、COM等“过时”的技术构建起来的系统,而且这些系统可能还需要维护和升级。如果我们生活在一个完美的世界,那么,我们倒的确可以尝试用最新的技术去构建和升级一切系统!

顺便一提的是,Longhorn本身不是托管的(Longhorn is NOT managed),而且从一开始就没打算将其设计成一个纯.Net的OS。Longhorn仍然是以现有的Windows代码为基础,经过许多的改进而成的。重要的是,Longhorn的开发接口WinFX托管的。

 

Posted by on 2005/03/16 in 未分类

68 Comments

Tags:

MSDN Webcast – SPS2003 SSO 管理及开发

3月15日下午14:30 – 16:00,我将在MSDN Webcast主讲《SharePoint Portal Server 2003 Single Sign On 管理及开发》,内容包括如何正确配置SPS2003的SSO服务,以及如何针对SPS2003的SSO进行开发。

在Webcast中,我将演示一个标准的使用Forms验证的ASP.NET程序,然后使用SPS2003的SSO进行集成登录。如果时间足够,还将演示一个标准的使用Windows集成验证(账号系统与SPS所在的AD不同)的ASP.NET程序,然后使用SPS2003的SSO进行集成登录。

欢迎大家来听!Webcast地址:http://www.mktgservice.com/ms/msdnwebcast/webcastdetails.aspx?itemID=25,Webcast会议地址:http://www.placeware.com/cc/msevents/join?id=msft031505yw&role=attend&pw=J4Z3HN

更新:课程视频和示范代码已提供下载

 

Posted by on 2005/03/15 in 未分类

36 Comments

Tags:

用代码获取SharePoint站点中InfoPath表单的数据

如果使用InfoPath作为企业流程数据输入客户端,那么如何使用代码访问保存于SharePoint表单库中的InfoPath表单的内容,是必需知道的。

总结来说,要点如下:

1、获取InfoPath表单所对应的SPFile对象。这个不再详述,不管是表单库的事件处理代码,抑或外部的应用程序,都需要首先得到代表InfoPath表单的SPFile对象。

2、将InfoPath表单的所有内容读入一个Stream中:
Stream stream= new MemoryStream(file.OpenBinary());

3、通过XML接口访问表单数据。通过一个Reader把Stream里面的内容以文本的形式读出来,就得到了包含了表单所有数据的XML文档的字符串表示形式。通过XmlDocument、XPath等接口,都能一步步的检索到自己需要的信息。

4、如果你实在讨厌通过XML接口去和一堆XML数据打交道,那么就用下面这个更加OO的办法。
首先,把InfoPath的原始.xsn文件解压开,把里面描述表单数据架构的.xsd文件找到,然后通过.Net Framework带的xsd.exe命令行工具,通过这个.xsd文件得到一个proxy类,然后在项目中使用这个类。比如一个工作单表单,我们得到了一个WorkItem类:
WorkItem workItem = new XmlSerializer(typeof(WorkItem)).Deserialize(stream) as WorkItem;
就把InfoPath表单的内容反序列化成了一个对象,然后直接访问这个对象的属性就行了。

 

Posted by on 2005/03/03 in 未分类

5 Comments

Tags:

Microsoft Office 技术专家俱乐部正式成立!

Office System已经不仅仅意味这文字编辑软件、表格处理软件的集合了,而逐渐成为了企业应用不可或缺的组件。从后台的SharePoint Portal Server、Project Server,到前端的Office SmartClient技术(智能文档、智能标签、VSTO、IBF…),Office System在企业应用中的作用越来越重要,Office开发人员在整个企业应用系统的开发中的地位也越来越突出!由微软公司主持的Office技术专家俱乐部(OTEC),在2005年3月份正式成立了!

俱乐部的正式会员能够得到的资源包括:
* 定期的俱乐部电子刊物
* 每月的中文TechNet光盘
* 不定期的Office技术光盘
* 优先获得Office相关技术的信息
* 微软市场活动和技术讲座的优先参与权
* 线下的俱乐部聚会
* 在俱乐部论坛中直接获得一定的微软公司技术支持
* ……

从3月份下旬开始,将在北京、上海、广州三地陆续召开俱乐部的首次线下聚会,在聚会上,成员们将就自己拿手的技术专题,给其他人分享多场精彩的技术讲座。

欢迎所有Office爱好者访问OTEC社区:http://otec.mscommunity.com/forums/。We Believe Office !

 

Posted by on 2005/03/03 in 未分类

34 Comments

Tags: