对于WCF是做什么的,以及具体的概念我在这不多说,只说WCF服务的创建和使用:
创建一个WCF服务有很多种方法,我在这说两种:
1. 一般创建
(1)创建服务
根据WCF的设计来说,创建WCF服务就是为了对外提供服务,外部程序可以通过服务访问并获取到自己需要的数据,具体创建如下:
建立工程,web的Winform的都可以,直接添加新建项,并选择WCF服务即可,此时VS会自动创建出接口和实现类,并添加config配置,你不需要手动配置,在接口中声明方法(每一个方法都必须加[OperationContract]),并在实例类中实例接口接口。
例如:
Interface类:
[ServiceContract]
publicinterfaceIService
{
[OperationContract]
string GetTestStr();
}
实现类:
public classService :IService
{
public string GetTestStr()
{
return "this isGetTestStr";
}
}
此时一个WCF服务基本创建完毕,当然此时还不能用,因为没有启动,具体启动如下:
新建一个winForm(只是为了演示,当然其他也可以),添加一个按钮作为启动接口,具体事件如下:(需引入System.ServiceModel;命名空间)
ServiceHost host = new ServiceHost(typeof(Service));
host.Open();
//这里Service是实例接口的类。
此时服务就可以启动了
(2)引用服务
服务端已经创建好了服务客户端如何使用呢,接下来就是客户端的使用,还是依然用Winform做测试:
客户端使用则应该引用服务,有两种方法:添加服务引用(这种客户端配置文件会自动生成),一种是添加引用(这种配置文件得手动写)
1)添加服务引用
右击引用添加引用服务,此时服务必须是开启的,否则搜索不到,引用地址可以在服务端的config中查找host节点下的baseAddress节点地址值或者在客户端的配置文件中找endpoint的节点值,引用服务以后便可以使用,
使用时:
using (ChannelFactory<IService1> channelFactory =new ChannelFactory<IService1>("GetTestStr"))
{
IService1 ibalance = channelFactory.CreateChannel();
using (ibalance as IDisposable)
{
var vosResult= ibalance.GetTestStr ();
label1.Text= vosResult.ToString();
}
}
***注意这里的IService1是你的接口名,参数GetTestStr是配置文件中的client节点下endpoint的name值。此时简单的服务便可完成。
2)添加引用
基本和添加服务引用一样只是,得手动添加一个配置文件并添加配置,配置内容即为自动生成时的一样。主要部分大致如下
<system.serviceModel>
<client>
<endpointaddress="http://localhost:8732/WCFContract/IService"
binding="basicHttpBinding"bindingConfiguration="basicBinding_IServer"
contract="WCFContract.IService"name="1" />
</client>
</system.serviceModel>
2. 自动创建(暂且这么叫)
上面的创建方法不难,使用方法也不难,但是有一个问题就是:我们每使用一个方法就得ChannelFactory<IService1> channelFactory=new ChannelFactory<IService1>("GetTestStr ")一次,且GetTestStr必须在配置文件中有此节点的配置,这样为开发带来很大的麻烦和繁琐(我个人认为)。于是我们可以使用另一种方法(利用ClientBase类):
新建一个类让其继承ClientBase类和IService1接口,如下:
class TestHander : ClientBase<IService>,IService
{
/**
* 此类使用 ClientBase系统自动生成了通道并与服务建立连接
* 省去了客户端使用时手动 ChannelFactory<IService> channelFactory =new ChannelFactory<IService>("SetUser")
* 以及配置终结点信息的操作
* 使用wcf服务的时候通过new此类并调用此类中的方法即可自动创建通道连接并调用服务方法
* */
public string GetTestStr()
{
return Channel. GetTestStr ();
}
}
此时在客户端使用的时候直接label1.Text = new TestHander().GetTestStr();就可以了。
废话不说了,直接上代码吧:
IService接口:
[ServiceContract]
public interface IService
{
[OperationContract]
string GetTestStr ();
}
Service实现接口
public classService:IService
{
public string GetTestStr ()
{
return “This is TestStr”;
}
}
服务端启动方法
ServiceHost host = newServiceHost(typeof(Service));
host.Open();
TestHander方法
class TestHander : ClientBase<IService>,IService
{
/**
* 此类使用 ClientBase系统自动生成了通道并与服务建立连接
* 省去了客户端使用时手动 ChannelFactory<IService> channelFactory =new ChannelFactory<IService>("SetUser")
* 以及配置终结点信息的操作
* 使用wcf服务的时候通过new此类并调用此类中的方法即可自动创建通道连接并调用服务方法
* */
public string GetTestStr()
{
return Channel. GetTestStr ();
}
}
客户端调用:
private void button2_Click(object sender, EventArgse)
{
label1.Text= new TestHander().GetTestStr();
}
3. 未知方法(此方法我不知道正确与否,只是好奇试过一次,觉得还行)
如果对以上两种方法觉得麻烦,这种方法就是最好的选择了,此种只能在Web中建立。
首先建立一个web应用程序,在此应用程序(非类库)中创建所有的WCF服务,最后运行此程序或者在IIS发布(目的是使其能通过URL搜索到服务),在其他项目中添加服务引用通过此应用程序的URL获取,便可以使用。(其实本质上还是通过路径找到服务,系统自动在你的项目中添加了其服务的类和方法)
源码下载地址:http://download.csdn.net/detail/dominates/6000943