我第一次尝试Indigo,是使用的VS 2005 PD6 + Indigo SDR(2.0.40903)这个版本,那个SDR的版本和现在公开发布的CTP版本已经有不少的差别了。现在我已经把我的Indigo运行环境更新到了VS2005 PD7(8.0.50110.30,也就是公开的Feb CTP版本) + Indigo CTP(2.0.50110.20),这两个版本能够非常好的一起工作。但是注意,现在的这个Indigo CTP是不能在即将发布的VS2005 Beta2上跑的,而当VS2005 Beta2发布的时候,预计Indigo也会相应的发布一个配套的版本。
在谈到更具体的话题之前,先说说什么是Indigo?最官方的答案是:“Indigo是一组用于构建和运行Connected System的.Net技术集合,是用于构建面向服务系统的通讯基础组件”。如果要具有“煽动性”一些,那么可以用这样的话:“Indigo是在未来打算接管.ASMX WebService、WSE、Remoting、DCOM、MSMQ等分布式系统通讯组件的东东”。
OK,我们先来接触一下Indigo的几个非常重要的概念术语,我希望用尽可能短的描述来让大家对这些术语有一个清晰的了解:
Service:一个服务,我们下面要演示的就是要创建一个Indigo Service。
Operation:每个Service都包含一个或多个Operation,Operation就是Service能做的事情。
Service Contract:用来描述服务的契约,Service Contract是Service用来向Client介绍和说明自己的手段,Client要调用Service,需要先了解Service Contract。
Service Uri:Service的Uri,要让Client能找到Service,Service就要有一个Uri公布出去。
Endpoint:Service公开的“端口”,Client通过这些Endpoint连接到Service,一个Service可以有一个或多个Endpoint。
Endpoint Address:Endpoint的地址,Service Uri + Endpoint Address,最终组成了Client连接此Endpoint的全地址。
Endpoint Binding:Endpoint所采用的网络协议、通讯方式、信息编码格式等,Indigo内置了一些标准的Binding,比如:WsProfileBinding是采用http/https、文本编码的一种Binding,NetProfileTcpBinding是采用Tcp、二进制编码的一种Binding。
对于每个Service,都需要有一个Host(中文常翻译为宿主)。Indigo支持多种Host形式,当前的Indigo CTP在WinXP/Win2003上支持IIS-Host和Self-Host,而在Longhorn平台上则还支持更佳的WAS-Host和IIS7-Host。IIS-Host类似于现在的.ASMX WebService,由IIS管理,Self-Host则是通过代码创建一个ServiceHost对象,让任意类型的程序(Console、WinForms…)都能成为Host。推荐大家在可能的情况下采用IIS-Host,因为这样可以得到IIS自带的自动回收进程、进程监视等优点。当然,在需要使用更高效率的Tcp协议通讯/二进制编码信息的场合,就需要用到Self-Host了,我们可以通过创建一个Indigo Windows Service来实现不间断的服务。
Indigo的Endpoint的设定支持配置文件的方式,而且也推荐使用配置文件的方式,而不要硬编码。这样,当我们需要让现有的普通采用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,这个Endpoint的Address是Ep1,Binding使用了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.cs的Proxy文件,将这个文件加入到项目中。第二个参数“/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。