程序员人生 网站导航

WCF--建立简单的WCF服务

栏目:互联网时间:2014-11-15 01:19:46
在VS2010里建立1个最简单的WCF服务,基本流程以下:
 
1:新建WCF利用
首先,新建1个WCF服务的利用,以下图所示

建立完成以后,VS将自动生成1个最简单的WCF工程,在这个利用中,包括了最基本Contract、Service。

工程以下:

不需要编辑任何文件,直接编译生成,得到1个WcfService1.dll文件
 
2、WCF利用中的契约(Contract)
在生成的WCF工程中,IService1.cs中为Contract(本例中契约和服务放在同1个工程下了,实际上也能够分为两个工程),代码以下:
[ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); [Operation Contract] CompositeType GetDataUsingDataContract(CompositeType composite); // TODO: Add your service operations here } // Use a data contract as illustrated in the sample below to add composite types to service operations. [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get {return boolValue; } set {boolValue = value; } } [DataMember] public string StringValue { get {return stringValue; } set {string Value = value; } } }

可以看到,声明了服务契约IService1,以接口情势声明,其中还包括两个操作契约GetData和GetDataUsingDataContract。还声明了数据契约CompositeType,以类的情势声明,包括两个数据成员BoolValue和StringValue。
 
3、WCF利用中的服务功能实现(ServiceBehavior)
在生成的WCF利用中,Service1.svc.cs中为“ServiceBehavior”(本例中契约和服务放在同1个工程下了,实际上也能够分为两个工程),代码以下(Service1.svc还有其它作用,后面再说):
public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}",value); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite== null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue+= "Suffix"; } return composite; } }


可以看到,这个Service1类实现了在契约中声明的IService1接口(服务契约),也使用到了CompositeType类(数据契约);实现了GetData和GetDataUsingDataContract这两个服务契约中功能,这些功能即为WCF服务允许外部程序进行调用的功能。
 
4、寄宿(Host)WCF服务
有2种常见的寄宿方式:
        1)1种是为1组WCF服务创建1个托管的利用程序,通过手工启动程序的方式对服务进行寄宿,所有的托管的利用程序都可作为WCF服务的宿主,比如 Console利用、Windows Forms利用和ASP.NET利用等,我们把这类方式的服务寄宿方式称为自我寄宿(Self Hosting)。
        2)另外一种则是通过操作系统现有的进程激活方式为WCF服务提过宿主,Windows下的进程激活手段包括IIS、Windows Service或WAS(Windows Process Activation Service)等
 
不管采取哪一种寄宿方式,在为某个服务创建 ServiceHost的进程中,WCF框架内部会履行1系列的操作,其中最重要的步骤就是为服务创建服务描写(Service Description)
 
本例以第1种为例,建立1个WinForm利用作为托管程序,在VS2010中,建立1个普通的WinForm程序(以frameword4.0为例),以下图:


在工程中,添加对System.ServiceModel的援用,并添加对刚才生成的WcfService1.dll的援用,然后在Form上添加1个Button和1个Label控件,以下图:

在WinForm工程中添加对要托管的WCF服务的描写,既可以通过代码实现,也能够通过工具生成。本例在VS2010下,通过Tools-WCF Service Configeration Editor工具生成。
点开后,通过菜单的File-New Config新建1个描写文件,然后点击Service页面的Create a New Service,弹出以下界面:


点击Browse...按钮,选中刚才生成的WcfService1.dll,并选中其中的Service1服务,点击下1步,弹出以下界面:


这个界面中要选择使用的契约,默许便可,点击下1步,弹出以下界面:

这个界面中要选择使用的网络通讯协议,选择最通用的HTTP协议,并在下1个界面当选择基本的Http服务(Basic WebService interoperablitity),

在接下来的界面中,输入访问地址,其它程序可以通过这个地址来访问本WCF服务。



完成这1步以后,接下来还有1些设置,我也不清楚用处,略去,最后点击File-Save,生成1个App.config文件。这里把该文件贴上来:
<?xml version="1.0" encoding="utf⑻"?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="NewBehavior0"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8585/wcf1/metadata" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="NewBehavior0" name="WcfService1.Service1"> <endpoint address="" binding="basicHttpBinding" bindingConfiguration="" name="ep1" contract="WcfService1.IService1" /> <host> <baseAddresses> <add baseAddress="http://localhost:8585/wcf1" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration>
把该App.config文件放在与WinForm工程的根目录下(与Form1.cs同1目录),还需要在VS中将该文件加入到工程中。

添加Button控件的处理函数:
private void button1_Click(objectsender, EventArgs e) { System.ServiceModel.ServiceHosthost =new System.ServiceModel.ServiceHost(typeof(WcfService1.Service1)); host.Open(); this.label1.Text= "opened"; }

编译运行,点击界面中的Button控件,便可以将该WCF服务寄宿到该Frm中(关闭窗体后WCF服务结束)。
注:如果运行时报这个毛病(HTTP could not register URL http://+:8585/wcf1/. Your process does not have http://www.wfuyu.com/access/ rights to this namespace),有多是权限不足致使,需要使用管理员权限运行。
 
5、在客户端访问并调用WCF服务
新建1个WinFrm工程(不要关闭刚才的寄宿界面),在VS菜单中点击Project-Add Service Reference..项,输入刚才在寄宿界面中定义的地址,就能够添加对该WCF服务的援用,以下图:


在程序中使用以下代码,便可以调用WCF服务中的GetData方法:

ServiceReference1.Service1Clientaa=newServiceReference1.Service1Client(); MessageBox.Show(aa.GetData(2));
6、总结
WCF1个简单的利用,刚刚接触,以后还有更多机会去深入学习。


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐