一个简单WCF项目的建立 by wsz
由于搬砖的需要,不得不学一点与WCF有关的东西。具体是因为前几周在64位环境下写的一个dll不能被集成到合作伙伴的32位工程中,但是要修改文件实在是划不来,一个压缩后600M的文件搬来搬去的也是让人蛋碎。因此想到了WCF。这样只要提供一个service,运行一个host,然后在client上调用就可以了。貌似是一件很简单的事,但是却做了整一下午还多。
WCF的确是个好东西,从功能来看,WCF可以看作是ASMX,.Net Remoting,Enterprise Service,WSE,MSMQ等很多我不懂的技术的并集。WCF中支持的传输协议包括HTTP、TCP、Peer network等很多我不懂的协议。简单介绍一下HTTP,和TCP的地址类型,大概是这样子的:
HTTP地址
即使用HTTP协议进行传输(包括https安全传输协议)。其地址形式为
http://localhost:8000/
如果地址中为制定端口号,则默认端口为80
TCP地址
使用TCP协议进行传输,其形式为:
net.tcp://localhost:8000/
下午经历了一个由HTTP到TCP过度的一个痛苦过程。个人感觉TCP要比HTTP麻烦那么一点。就用HTTP协议简单介绍一下这个建立过程。
一个简单的WCF
建立host可以用两种方式,一种是直接建立一个WCF服务集+一个host项目,另一种是建立两个类库+一个host项目。直观的区别是用服务集可以将interface和service放在一个项目下;否则就是用一个类库作为interface,另一个作为service。这里就用两个类库为例吧。先在解决方案中添加一个类库取名Contract作为服务契约(要添加ServiceModel的引用),在建立一个Service类库(要添加ServiceModel和Contract的引用)。在Contract中写一个简单的interface如下(用来计算a与b的和):
namespace Contract
{
[ServiceContract]
public interface ICaculate
{
[OperationContract]
int Caculate(int a,int b);
}
}
[ServiceContract]表示服务契约,就是在ServiceModel的引用下的。
在Service中实现这个类
namespace Service
{
public class myCaculate:ICaculate
{
public int Caculate(int x, int y)
{
return x + y;
}
}
}
接下来添加一个Host项目比如一个控制台程序,大概是这样的(要把Host设置为主项):
在Host项目中要添加ServiceModel,Service和Contract的引用。这里有两种方式写Program中的代码。一种是直接在代码写协议的类型,另一种是在App.config中设置协议。这里用配置文件的方式,因为这样host中的代码会非常简单,而且个人感觉App.config在WCF中扮演一个很犀利的角色。这需要我们先生成一个大概的App.config代码框架,再根据具体情况设置参数(如果整个配置文件都是手写的,那只能Or2)。具体的编辑工具在VS2010的工具à服务配置编辑器中。打开Host中的配置文件,主要的任务是添加service和behavior,此外要建立一个url作为endpoint。这里选择basicHttpBinding绑定方式。具体操作很简单就不赘述了,用起来很方便。重要的是设置完成之后别忘了保存,否则就白费了。生成的配置文件大概是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Behavior0">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="Behavior0" name="Service.myCaculate">
<endpoint address="http://localhost:8080/HelloService" binding="basicHttpBinding"
bindingConfiguration="" contract="Contract.ICaculate" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/HelloService" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
</configuration>
Behavior的名字是随便取的,这里的url是http://localhost:8080/HelloService。
这样host的main函数中代码就很简单了
ServiceHost host = new ServiceHost(typeof(myCaculate));
host.Open();
Console.WriteLine("Start Your Service.");
Console.ReadKey();
host.Close();
这么几行就够了。这样host就可以运行了。接下来建立一个控制台程序作为Client。建立好之后,先让Host运行起来,然后在client的引用中添加ServiceReferences http://localhost:8080/HelloService。
这样在Client的代码中就可以调用Service中的myCaculate类来计算两个数的和了。
在Client中可以直接调用Service(代码比较麻烦)或者通过代理调用(简单多了)。
代理调用的代码如下:
ServiceReference1.CaculateClient ca = new ServiceReference1.CaculateClient();
Console.WriteLine(ca.Caculate(6, 7));
一个简单的http协议的WCF就是在这样了。在Host的App.Config中可以进行很多参数的设定,比如传输的最大字节,timeout等。都根据具体的需要进行设定。对于TCP协议的要麻烦一点。不过大体流程是一样的。
WCF的跨平台性很好,而且集成了多种协议,微软的这个产品的确令人佩服。