首页 > 代码库 > WCF--建立简单的WCF服务

WCF--建立简单的WCF服务

在VS2010里建立一个最简单的WCF服务,基本流程例如以下:
 
一:新建WCF应用
首先,新建一个WCF服务的应用。例如以下图所看到的
技术分享
建立完毕之后,VS将自己主动生成一个最简单的WCFproject,在这个应用中,包括了最基本Contract、Service。

project例如以下:
技术分享
不须要编辑不论什么文件。直接编译生成,得到一个WcfService1.dll文件
 
二、WCF应用中的契约(Contract)
在生成的WCFproject中,IService1.cs中为Contract(本例中契约和服务放在同一个project下了,实际上也能够分为两个project),代码例如以下:
[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 = http://www.mamicode.com/true;"Hello ";
    [DataMember]
    public bool BoolValue
    {
        get {return boolValue; }
        set {boolValue = http://www.mamicode.com/value; }>
能够看到。声明了服务契约IService1,以接口形式声明,当中还包括两个操作契约GetData以及GetDataUsingDataContract。

还声明了数据契约CompositeType,以类的形式声明。包括两个数据成员BoolValue和StringValue。

 
三、WCF应用中的服务功能实现(ServiceBehavior)
在生成的WCF应用中,Service1.svc.cs中为“ServiceBehavior”(本例中契约和服务放在同一个project下了。实际上也能够分为两个project),代码例如以下(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服务同意外部程序进行调用的功能。
 
四、寄宿(Host)WCF服务
有2种常见的寄宿方式:
        1)一种是为一组WCF服务创建一个托管的应用程序,通过手工启动程序的方式对服务进行寄宿。全部的托管的应用程序均可作为WCF服务的宿主,比方 Console应用、Windows Forms应用和ASP.NET应用等,我们把这样的方式的服务寄宿方式称为自我寄宿(Self Hosting)。

        2)还有一种则是通过操作系统现有的进程激活方式为WCF服务提过宿主,Windows下的进程激活手段包含IIS、Windows Service或者WAS(Windows Process Activation Service)等
 
不管採用哪种寄宿方式,在为某个服务创建 ServiceHost的过程中,WCF框架内部会运行一系列的操作,当中最重要的步骤就是为服务创建服务描写叙述(Service Description)
 
本例以第一种为例,建立一个WinForm应用作为托管程序。在VS2010中。建立一个普通的WinForm程序(以frameword4.0为例),例如以下图:
技术分享

在project中,加入对System.ServiceModel的引用,并加入对刚才生成的WcfService1.dll的引用,然后在Form上加入一个Button和一个Label控件,例如以下图:
技术分享
在WinFormproject中加入对要托管的WCF服务的描写叙述,既能够通过代码实现,也能够通过工具生成。

本例在VS2010下,通过Tools-WCF Service Configeration Editor工具生成。

点开后,通过菜单的File-New Config新建一个描写叙述文件,然后点击Service页面的Create a New Service,弹出例如以下界面:
技术分享

点击Browse...button。选中刚才生成的WcfService1.dll,并选中当中的Service1服务,点击下一步。弹出例如以下界面:
技术分享

这个界面中要选择使用的契约,默认就可以,点击下一步,弹出例如以下界面:
技术分享
这个界面中要选择使用的网络通讯协议,选择最通用的HTTP协议。并在下一个界面中选择主要的Http服务(Basic WebService interoperablitity),

在接下来的界面中,输入訪问地址,其他程序能够通过这个地址来訪问本WCF服务。

技术分享

完毕这一步之后。接下来另一些设置,我也不清楚用途,略去,最后点击File-Save,生成一个App.config文件。这里把该文件贴上来:
<?xml version="1.0" encoding="utf-8"?

> <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文件放在与WinFormproject的根文件夹下(与Form1.cs同一文件夹),还须要在VS中将该文件增加到project中。

加入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 access rights to this namespace),有可能是权限不足导致,须要使用管理员权限执行。

 
五、在client訪问并调用WCF服务
新建一个WinFrmproject(不要关闭刚才的寄宿界面)。在VS菜单中点击Project-Add Service Reference..项,输入刚才在寄宿界面中定义的地址。就能够加入对该WCF服务的引用,例如以下图:

技术分享
在程序中使用例如以下代码,即能够调用WCF服务中的GetData方法:

ServiceReference1.Service1Clientaa=newServiceReference1.Service1Client();
MessageBox.Show(aa.GetData(2));
六、总结
WCF一个简单的应用,刚刚接触,以后还有很多其它机会去深入学习。



WCF--建立简单的WCF服务