因为项目比较大,接口一大堆,同时也是为了模块间完全解耦(只依赖Common),只能是采用多个WCF服务类库的方案。这样带来的问题就是上帝都不知道在配置文件中到底需要配置多少个Endpoint!理论上是一个模块一个Endpoint,但问题是没有人知道今后这个系统会有哪些模块。于是,只能是不要配置文件了。
为了实现在代码中配置WCF客户端,废了好几天的时间,看了无数的文章,尝试了N种方法。。。。。结果,因为一次偶然的bug,发现了这个真的让人欲哭无泪的、天理不容的、简单到令人发指的方法!!!啥都不说了,贴代码。
#region 字段声明
private EndpointAddress _Address;
private NetTcpBinding _Binding = new NetTcpBinding();
private BaseService.BaseClient _Client;
#endregion
#region 构造函数
public Login()
{
//从配置文件读取地址和端口设置
_BaseAddress = String.Format("net.tcp://{0}:{1}/", Config.BaseAddress(), Config.Port());
_Address = new EndpointAddress(_BaseAddress + "MainForm");//为不同的服务加上相应的路径,这样多个服务就可以使用同一个端口
_Binding.Security.Mode = SecurityMode.None;
_Binding.MaxReceivedMessageSize = 1048576;
_Binding.ReaderQuotas.MaxStringContentLength = 16777216;
_Binding.ReaderQuotas.MaxArrayLength = 16777216;
InitializeComponent();
}
#endregion
private void InitOrgTree()
{
_Client = new BaseService.BaseClient(_Binding, _Address);
_OrgList = _Client.OrgTreeList();
_MemberList = _Client.GetMemberList();
_Client.Close();
}
简单说明下,真的很简单。。。申明两个变量,分别是_Address和_Binding,_Binding的类型需要根据你所使用的网络协议,用对应的类型去声明。
然后给_Binding设置一些需要设置的属性。最后,在实例化xxx(取决于添加服务引用时输入的名字)Client方法里面传入这两个参数就行了。
什么反射!什么工厂!!都弱爆了有木有!!!