(此项目用于向外提供格局,服务合同、操作家协会议、数据公约伟德国际1946

1.创制WCF服务库:WcfServiceLibrary,依据活动创造的代码改革本身的WCF
服务合同、操作家组织议、数据公约。这一次先完结轻易的WCF最基本的通讯格局:需要-》应答情势。

先是大家用VS(我用的是VS二零零六卡塔 尔(英语:State of Qatar)创立三个空设计方案。
並且在那实施方案中增加五个门类(如下卡塔尔
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;(怎么这样麻烦.伟德国际1946 1
别的,大家都要在这里4 个类别中引进WCF中的系统类库。(System.瑟维斯Model;
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;

伟德国际1946 2伟德国际1946 3Code
伟德国际1946 4using System;
伟德国际1946 5using System.Collections.Generic;
伟德国际1946 6using System.Linq;
伟德国际1946 7using System.Text;
伟德国际1946 8using System.ServiceModel;
伟德国际1946 9using System.Runtime.Serialization;
伟德国际1946 10using WCF.MyDataContract;
伟德国际1946 11
伟德国际1946 12
伟德国际1946 13namespace WCF.MyServerContract
伟德国际1946 14伟德国际1946 15伟德国际1946 16{
伟德国际1946 17    [ServiceContract]
伟德国际1946 18    public interface IServer
伟德国际1946 19伟德国际1946 20    伟德国际1946 21{
伟德国际1946 22        [OperationContract]
伟德国际1946 23        List< MyData.Order> getOrder(int id);
伟德国际1946 24    }
伟德国际1946 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);
}

伟德国际1946 26伟德国际1946 27Code
伟德国际1946 28using System;
伟德国际1946 29using System.Collections.Generic;
伟德国际1946 30using System.Linq;
伟德国际1946 31using System.Text;
伟德国际1946 32using WCF.MyDataContract;
伟德国际1946 33
伟德国际1946 34namespace WCF.MyServer
伟德国际1946 35伟德国际1946 36伟德国际1946 37{
伟德国际1946 38    
伟德国际1946 39    public class Server:WCF.MyServerContract.IServer
伟德国际1946 40伟德国际1946 41    伟德国际1946 42{
伟德国际1946 43伟德国际1946 44        IServer 成员#region IServer 成员
伟德国际1946 45
伟德国际1946 46        List<MyData.Order> WCF.MyServerContract.IServer.getOrder(int id)
伟德国际1946 47伟德国际1946 48        伟德国际1946 49{
伟德国际1946 50伟德国际1946 51            MyData.Order od1 = new MyData.Order 伟德国际1946 52{ ID = 1, Money = 200, Des = “描述”, Name = “乐乐” };
伟德国际1946 53伟德国际1946 54            MyData.Order od2 = new MyData.Order 伟德国际1946 55{ ID = 2, Money = 300, Des = “描述”, Name = “罗勇” };
伟德国际1946 56伟德国际1946 57            MyData.Order od3 = new MyData.Order 伟德国际1946 58{ ID = 3, Money = 100, Des = “描述”, Name = “lele” };
伟德国际1946 59            List<MyData.Order> ods = new List<MyData.Order>();
伟德国际1946 60            ods.Add(od1);
伟德国际1946 61            ods.Add(od2);
伟德国际1946 62            ods.Add(od3);
伟德国际1946 63            return ods;
伟德国际1946 64        }
伟德国际1946 65
伟德国际1946 66        #endregion
伟德国际1946 67    }
伟德国际1946 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:数据公约,给专门的学业提供实体。大家看代码就懂啊。

定义数据公约:

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

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

再有三个Host项目
Program.cs文件的源委如下

// 使用下边示例中表明的数据约定将复合类型丰硕到劳动操作。
[DataContract]
public class UserInfo
{
[DataMember]
public string IdCard { set; get; }

伟德国际1946 110伟德国际1946 111Code
伟德国际1946 112using System;
伟德国际1946 113using System.Collections.Generic;
伟德国际1946 114using System.Linq;
伟德国际1946 115using System.Text;
伟德国际1946 116using System.ServiceModel;
伟德国际1946 117
伟德国际1946 118namespace Host
伟德国际1946 119伟德国际1946 120伟德国际1946 121{
伟德国际1946 122    class Program
伟德国际1946 123伟德国际1946 124    伟德国际1946 125{
伟德国际1946 126        static void Main(string[] args)
伟德国际1946 127伟德国际1946 128        伟德国际1946 129{      
伟德国际1946 130伟德国际1946 131            开始化主机,并用Console作为宿主运营服务#region 开始化主机,并用Console作为宿主运转服务
伟德国际1946 132
伟德国际1946 133            using (ServiceHost host = new ServiceHost(typeof(WCF.MyServer.Server)))
伟德国际1946 134伟德国际1946 135            伟德国际1946 136{
伟德国际1946 137                host.Open();
伟德国际1946 138                Console.WriteLine(“服务已开发银行,按大肆键甘休劳动!”);
伟德国际1946 139                Console.ReadLine();
伟德国际1946 140            }
伟德国际1946 141            #endregion
伟德国际1946 142        }
伟德国际1946 143    }
伟德国际1946 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; }
}

伟德国际1946 145伟德国际1946 146Code
伟德国际1946 147<?xml version=”1.0″ encoding=”utf-8″ ?>
伟德国际1946 148<configuration>
伟德国际1946 149  <system.serviceModel>
伟德国际1946 150    <services>
伟德国际1946 151      <service name=”WCF.MyServer.Server” behaviorConfiguration=”orderBehav”>
伟德国际1946 152        <host>
伟德国际1946 153          <baseAddresses>
伟德国际1946 154            <add baseAddress=”http://localhost:8090"/&gt;
伟德国际1946 155            <add baseAddress=”net.tcp://localhost:8010″/>
伟德国际1946 156          </baseAddresses>
伟德国际1946 157        </host>
伟德国际1946 158        <endpoint address=”Server1″ binding=”netTcpBinding” contract=”WCF.MyServerContract.IServer”/>
伟德国际1946 159        <endpoint address=”Server2″ binding=”wsHttpBinding” contract=”WCF.MyServerContract.IServer”/>
伟德国际1946 160        <endpoint contract=”IMetadataExchange” binding=”mexHttpBinding” address=”mex” />
伟德国际1946 161      </service>
伟德国际1946 162    </services>
伟德国际1946 163    <behaviors>
伟德国际1946 164      <serviceBehaviors>
伟德国际1946 165        <behavior name=”orderBehav”>
伟德国际1946 166          <serviceMetadata httpGetEnabled=”true” httpGetUrl=”http://localhost:8400"/&gt;
伟德国际1946 167        </behavior>
伟德国际1946 168      </serviceBehaviors>
伟德国际1946 169    </behaviors>
伟德国际1946 170  </system.serviceModel>
伟德国际1946 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=”http://localhost:8021/User/” />
</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(“http://localhost:8021/User“);
//成立宿主
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应用程序。

加上对劳动的援引(在援引上右键–>输入大家定义的服务宿主的集散地址(此处为:http://localhost:8021/User)–&gt;前往–&gt;确定)。

若报错的话,首先检查WCF服务地点是不是准确;再检查防火墙设置,服务端口是还是不是曾经安装为安全端口。平时都以端口未有开放的缘故引致错误。

相关文章