1.创建WCF服务库:WcfServiceLibrary,根据自动创建的代码修改自己的WCF
服务协议、操作协议、数据协议。本次先实现简单的WCF最基本的通信方式:请求-》应答模式。

首先我们用VS(我用的是VS2008)创建一个空解决方案。
并且在此解决方案中添加三个项目(如下)
1.建一个C#类库,定名为WCF.MyServerContract;(此项目用于向外提供方法,里面就是一个接口文件,大家都说他是服务契约)

定义服务、操作协议接口:

2.再建一个C#类库,定名为WCF.MyServer主要是实现WCF.MyServerContract中的那个接口(可以理解为业务层吧);

[ServiceContract]
public interface IUser
{
[OperationContract(IsOneWay = true)]
void SetData(UserInfo _UserInfo);

3.还是建一个C#类库,定名为WCF.MyDataContract(里面放的的是我们要用到的一些数据实体)(大家称他为数据契约)

[OperationContract]
List<UserInfo> GetData();

4.另外我们还要建上个控制台程序,定名为Host(他呢,就只有一个用处,用来启动我们的WCF服务)

[OperationContract]
int GetCount();
}

好啦,上面的四个项目就形成啦我们的WCF服务端啦。

实现协议接口:

哦,忘记说他们之间的依赖关系:4要引用2 ; 2要引用3; 1
要引用2各3;(怎么这么麻烦.乐百家官方网站 1
另外,我们都要在这4 个项目中引入WCF中的系统类库。(System.ServiceModel;
System.Runtime.Serialization;)

 

准备工作做好啦,下面把代码贴上来。
WCF.MyServerContract:里面就一个IServer.cs文件

// 注意:
使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
public class User : IUser
{
IUserCallBack callback = null;
/// <summary>
/// 构造函数
/// </summary>
public User()
{
Timer time = new Timer(10000);
time.Enabled = true;
time.Elapsed += time_Elapsed;

乐百家官方网站 2乐百家官方网站 3Code
乐百家官方网站 4using System;
乐百家官方网站 5using System.Collections.Generic;
乐百家官方网站 6using System.Linq;
乐百家官方网站 7using System.Text;
乐百家官方网站 8using System.ServiceModel;
乐百家官方网站 9using System.Runtime.Serialization;
乐百家官方网站 10using WCF.MyDataContract;
乐百家官方网站 11
乐百家官方网站 12
乐百家官方网站 13namespace WCF.MyServerContract
乐百家官方网站 14乐百家官方网站 15乐百家官方网站 16{
乐百家官方网站 17    [ServiceContract]
乐百家官方网站 18    public interface IServer
乐百家官方网站 19乐百家官方网站 20    乐百家官方网站 21{
乐百家官方网站 22        [OperationContract]
乐百家官方网站 23        List< MyData.Order> getOrder(int id);
乐百家官方网站 24    }
乐百家官方网站 25}

callback =
OperationContext.Current.GetCallbackChannel<IUserCallBack>();
}

WCF.MyServerContract:实现上面的IServer。也只有一个文件。。呵呵~~

void time_Elapsed(object sender, ElapsedEventArgs e)
{
callback.DataChanged();
}
public void SetData(UserInfo _UserInfo)
{
if (!UserCollection.Users.Exists(p => p.IdCard ==
_UserInfo.IdCard))
UserCollection.Users.Add(_UserInfo);
}

乐百家官方网站 26乐百家官方网站 27Code
乐百家官方网站 28using System;
乐百家官方网站 29using System.Collections.Generic;
乐百家官方网站 30using System.Linq;
乐百家官方网站 31using System.Text;
乐百家官方网站 32using WCF.MyDataContract;
乐百家官方网站 33
乐百家官方网站 34namespace WCF.MyServer
乐百家官方网站 35乐百家官方网站 36乐百家官方网站 37{
乐百家官方网站 38    
乐百家官方网站 39    public class Server:WCF.MyServerContract.IServer
乐百家官方网站 40乐百家官方网站 41    乐百家官方网站 42{
乐百家官方网站 43乐百家官方网站 44        IServer 成员#region IServer 成员
乐百家官方网站 45
乐百家官方网站 46        List<MyData.Order> WCF.MyServerContract.IServer.getOrder(int id)
乐百家官方网站 47乐百家官方网站 48        乐百家官方网站 49{
乐百家官方网站 50乐百家官方网站 51            MyData.Order od1 = new MyData.Order 乐百家官方网站 52{ ID = 1, Money = 200, Des = “描述”, Name = “乐乐” };
乐百家官方网站 53乐百家官方网站 54            MyData.Order od2 = new MyData.Order 乐百家官方网站 55{ ID = 2, Money = 300, Des = “描述”, Name = “罗勇” };
乐百家官方网站 56乐百家官方网站 57            MyData.Order od3 = new MyData.Order 乐百家官方网站 58{ ID = 3, Money = 100, Des = “描述”, Name = “lele” };
乐百家官方网站 59            List<MyData.Order> ods = new List<MyData.Order>();
乐百家官方网站 60            ods.Add(od1);
乐百家官方网站 61            ods.Add(od2);
乐百家官方网站 62            ods.Add(od3);
乐百家官方网站 63            return ods;
乐百家官方网站 64        }
乐百家官方网站 65
乐百家官方网站 66        #endregion
乐百家官方网站 67    }
乐百家官方网站 68}

public List<UserInfo> GetData()
{
return UserCollection.Users;
}
public UserInfo GetDataById(string IdCard)
{
return UserCollection.Users.First((p) => { return p.IdCard.ToLower()
== IdCard.ToLower(); });
}
public int GetCount()
{
return UserCollection.Users.Count();
乐百家官方网站,}
}

WCF.MyDataContract:数据契约,给业务提供实体。大家看代码就懂啦。

定义数据协议:

乐百家官方网站 69乐百家官方网站 70Code
乐百家官方网站 71using System;
乐百家官方网站 72using System.Collections.Generic;
乐百家官方网站 73using System.Linq;
乐百家官方网站 74using System.Text;
乐百家官方网站 75using System.ServiceModel;
乐百家官方网站 76using System.Runtime.Serialization;
乐百家官方网站 77
乐百家官方网站 78namespace WCF.MyDataContract
乐百家官方网站 79乐百家官方网站 80乐百家官方网站 81{
乐百家官方网站 82    public class MyData
乐百家官方网站 83乐百家官方网站 84    乐百家官方网站 85{
乐百家官方网站 86        [DataContract]
乐百家官方网站 87        public class Order
乐百家官方网站 88乐百家官方网站 89        乐百家官方网站 90{
乐百家官方网站 91            [DataMember]
乐百家官方网站 92乐百家官方网站 93            public int ID 乐百家官方网站 94{ get; set; }
乐百家官方网站 95            [DataMember]
乐百家官方网站 96乐百家官方网站 97            public string Name 乐百家官方网站 98{ get; set; }
乐百家官方网站 99            [DataMember]
乐百家官方网站 100乐百家官方网站 101            public float Money 乐百家官方网站 102{ get; set; }
乐百家官方网站 103
乐百家官方网站 104乐百家官方网站 105            public string Des 乐百家官方网站 106{ get; set; }
乐百家官方网站 107        }
乐百家官方网站 108    }
乐百家官方网站 109}

public enum Sex
{
Male = 1,//男性
FeMale = 0//女性
}

还有一个Host项目
Program.cs文件的内容如下

// 使用下面示例中说明的数据约定将复合类型添加到服务操作。
[DataContract]
public class UserInfo
{
[DataMember]
public string IdCard { set; get; }

乐百家官方网站 110乐百家官方网站 111Code
乐百家官方网站 112using System;
乐百家官方网站 113using System.Collections.Generic;
乐百家官方网站 114using System.Linq;
乐百家官方网站 115using System.Text;
乐百家官方网站 116using System.ServiceModel;
乐百家官方网站 117
乐百家官方网站 118namespace Host
乐百家官方网站 119乐百家官方网站 120乐百家官方网站 121{
乐百家官方网站 122    class Program
乐百家官方网站 123乐百家官方网站 124    乐百家官方网站 125{
乐百家官方网站 126        static void Main(string[] args)
乐百家官方网站 127乐百家官方网站 128        乐百家官方网站 129{      
乐百家官方网站 130乐百家官方网站 131            初始化主机,并用Console作为宿主运行服务#region 初始化主机,并用Console作为宿主运行服务
乐百家官方网站 132
乐百家官方网站 133            using (ServiceHost host = new ServiceHost(typeof(WCF.MyServer.Server)))
乐百家官方网站 134乐百家官方网站 135            乐百家官方网站 136{
乐百家官方网站 137                host.Open();
乐百家官方网站 138                Console.WriteLine(“服务已启动,按任意键结束服务!”);
乐百家官方网站 139                Console.ReadLine();
乐百家官方网站 140            }
乐百家官方网站 141            #endregion
乐百家官方网站 142        }
乐百家官方网站 143    }
乐百家官方网站 144}

[DataMember]
public string FirstName { set; get; }
[DataMember]
public string LastName { set; get; }
[DataMember]
public Sex UserSex { set; get; }

Host还有一个配制文件(App.config)。也贴出来。

[DataMember]
public Int16 Age { set; get; }
}

乐百家官方网站 145乐百家官方网站 146Code
乐百家官方网站 147<?xml version=”1.0″ encoding=”utf-8″ ?>
乐百家官方网站 148<configuration>
乐百家官方网站 149  <system.serviceModel>
乐百家官方网站 150    <services>
乐百家官方网站 151      <service name=”WCF.MyServer.Server” behaviorConfiguration=”orderBehav”>
乐百家官方网站 152        <host>
乐百家官方网站 153          <baseAddresses>
乐百家官方网站 154            <add baseAddress=”;
乐百家官方网站 155            <add baseAddress=”net.tcp://localhost:8010″/>
乐百家官方网站 156          </baseAddresses>
乐百家官方网站 157        </host>
乐百家官方网站 158        <endpoint address=”Server1″ binding=”netTcpBinding” contract=”WCF.MyServerContract.IServer”/>
乐百家官方网站 159        <endpoint address=”Server2″ binding=”wsHttpBinding” contract=”WCF.MyServerContract.IServer”/>
乐百家官方网站 160        <endpoint contract=”IMetadataExchange” binding=”mexHttpBinding” address=”mex” />
乐百家官方网站 161      </service>
乐百家官方网站 162    </services>
乐百家官方网站 163    <behaviors>
乐百家官方网站 164      <serviceBehaviors>
乐百家官方网站 165        <behavior name=”orderBehav”>
乐百家官方网站 166          <serviceMetadata httpGetEnabled=”true” httpGetUrl=”;
乐百家官方网站 167        </behavior>
乐百家官方网站 168      </serviceBehaviors>
乐百家官方网站 169    </behaviors>
乐百家官方网站 170  </system.serviceModel>
乐百家官方网站 171</configuration>

 

以上就是一个简单WCF的服务端啦。其实内容不多。我只是把他分的细点。(可能有点杀鸡用牛刀的感觉。呵呵)
WCF程序与一般的程序也没什么区别,主要是在接口,方法,类,属性上加了WCF用到的属性标签(如:DataCtract)

2.创建控制台应用程序,将上面的WCF服务库项目添加进来。配置和打开宿主、终结点、行为描述。
host、EndPoint、behaviors可以在Config中设置,也可以在程序中实现。

下一篇我将说说如何在客户端调用WCF服务。

A.配置Config,控制台主程序中只需要启动宿主就行了,配置节为:

<system.serviceModel>
<services>
<service name=”WcfServiceLibrary.User”>
<endpoint address=”” binding=”basicHttpBinding”
contract=”WcfServiceLibrary.IUser”>
<identity>
<dns value=”localhost” />
</identity>
</endpoint>
<endpoint address=”mex” binding=”mexHttpBinding”
contract=”IMetadataExchange” />
<host>
<baseAddresses>
<add baseAddress=”” />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!–为避免泄漏元数据信息,
请在部署前将以下值设置为 false–>
<serviceMetadata httpGetEnabled=”True” httpsGetEnabled=”True”/>
<!–要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息–>
<serviceDebug includeExceptionDetailInFaults=”False” />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

//启动SeriviceHost

static void Main(string[] args)
{

ServiceHost host = new ServiceHost(typeof(WcfServiceLibrary.User));
host.Open();
Console.WriteLine(“WCF中的HTTP监听已启动….”);
Console.ReadLine();
host.Close();
}

 

B.配置文件中的配置,也可以直接在程序中实现:

static void Main(string[] args)
{

//创建宿主的基地址
Uri baseAddress = new Uri(“”);
//创建宿主
using (ServiceHost host = new
ServiceHost(typeof(WcfServiceLibrary.User), baseAddress))
{
//向宿主中添加终结点
host.AddServiceEndpoint(typeof(WcfServiceLibrary.IUser), new
WSHttpBinding(), “”);
//将HttpGetEnabled属性设置为true
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
//将行为添加到Behaviors中
host.Description.Behaviors.Add(smb);
//打开宿主
host.Open();
Console.WriteLine(“WCF中的HTTP监听已启动….”);
Console.ReadLine();
host.Close();
}

}

3.启动服务,创建Web应用程序。

添加对服务的引用(在引用上右键–>输入我们定义的服务宿主的基地址(此处为:

若报错的话,首先检查WCF服务地址是否正确;再检查防火墙设置,服务端口是否已经设置为安全端口。一般都是端口没有开放的原因造成错误。