增进宿主为调整台应用程序的WCF服务,WCF学习之旅

1.创制WCF服务库:Wcf瑟维斯Library,依照活动创立的代码修改自个儿的WCF
服务协议、操作家组织议、数据协议。本次先落成简单的WCF最中央的通讯方式:诉求-》应答情势。

先是我们用VS(作者用的是VS二〇〇九)创立二个空化解方案。
还要在此化解方案中增添多少个体系(如下)
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;(怎么这么麻烦.lovebet爱博体育 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;

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

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

定义数据协议:

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

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

还大概有一个Host项目
Program.cs文件的原委如下

// 使用上边示例中验证的数码约定将复合类型丰裕到服务操作。
[DataContract]
public class UserInfo
{
[DataMember]
public string IdCard { set; get; }

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

lovebet爱博体育 145lovebet爱博体育 146Code
lovebet爱博体育 147<?xml version=”1.0″ encoding=”utf-8″ ?>
lovebet爱博体育 148<configuration>
lovebet爱博体育 149  <system.serviceModel>
lovebet爱博体育 150    <services>
lovebet爱博体育 151      <service name=”WCF.MyServer.Server” behaviorConfiguration=”orderBehav”>
lovebet爱博体育 152        <host>
lovebet爱博体育 153          <baseAddresses>
lovebet爱博体育 154            <add baseAddress=”http://localhost:8090"/&gt;
lovebet爱博体育 155            <add baseAddress=”net.tcp://localhost:8010″/>
lovebet爱博体育 156          </baseAddresses>
lovebet爱博体育 157        </host>
lovebet爱博体育 158        <endpoint address=”Server1″ binding=”netTcpBinding” contract=”WCF.MyServerContract.IServer”/>
lovebet爱博体育 159        <endpoint address=”Server2″ binding=”wsHttpBinding” contract=”WCF.MyServerContract.IServer”/>
lovebet爱博体育 160        <endpoint contract=”IMetadataExchange” binding=”mexHttpBinding” address=”mex” />
lovebet爱博体育 161      </service>
lovebet爱博体育 162    </services>
lovebet爱博体育 163    <behaviors>
lovebet爱博体育 164      <serviceBehaviors>
lovebet爱博体育 165        <behavior name=”orderBehav”>
lovebet爱博体育 166          <serviceMetadata httpGetEnabled=”true” httpGetUrl=”http://localhost:8400"/&gt;
lovebet爱博体育 167        </behavior>
lovebet爱博体育 168      </serviceBehaviors>
lovebet爱博体育 169    </behaviors>
lovebet爱博体育 170  </system.serviceModel>
lovebet爱博体育 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“);
lovebet爱博体育,//创设宿主
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服务地方是或不是科学;再自己争执防火墙设置,服务端口是不是已经安装为安全端口。一般都以端口未有开放的原故导致错误。

相关文章