在WCF中配置节点可以有多种方式,下面依次讲解。
1:利用配置文件进行配置。新建一个控制台应用程序或者winform或者wpf都是可以的。然后我们就可以在他的app.config里面进行相关配置,代码都是一样的。下面是代码。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<system.serviceModel>
<services>
<service name="WcfLib.Message" behaviorConfiguration="WCFCfg">
<host>
<baseAddresses>
<add baseAddress="http://localhost/7788/Message"/><!--这是双工通信配置的基地址-->
<add baseAddress="net.tcp://10.10.14.158:7788/Message"/><!--这是TCP配置的基地址-->
<add baseAddress="net.pipe://localhost/"/><!--这是管道通信配置-->
</baseAddresses>
</host>
<endpoint address="" binding="wsDualHttpBinding" contract="WcfLib.IMessage"/><!--双工通信终结点配置-->
<endpoint address="" binding="netTcpBinding" contract="WcfLib.IMessage"/>
<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
<!--这两个都是TCP终结点配置,缺一不可,如果单独使用后面的
serviceMetadata httpGetEnabled="false"得设置为false-->
<endpoint address="" binding="mexNamedPipeBinding" contract="IMetadataExchange"/>
<endpoint address="mex" binding="netNamedPipeBinding" contract="WcfLib.IMessage"/>
<!--这两个都是管道终结点配置,缺一不可,如果单独使用后面的
serviceMetadata httpGetEnabled="false"得设置为false-->
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFCfg">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="6553600"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
第二步添加引用using System.ServiceModel;然后在它的启动代码或是最开始运行的地方。控制台main函数,另外两个可以写在
窗口加载事件中。下面是控制台代码。
using (ServiceHost host = new ServiceHost(ServiceType))一个typeof类型的实现服务的类
{
host.Open();
Console.WriteLine("服务已经启动!");
Console.ReadLine();
host.Close();
}
最后以管理员的身份运行就可以启动服务了。
2:直接在启动程序中使用代码进行配置,首先获取本机的可用IP v4地址,代码如下
public string GetIP()
{
string name = Dns.GetHostName();
IPHostEntry me = Dns.GetHostEntry(name);
IPAddress[] ips = me.AddressList;
foreach (IPAddress ip in ips)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
return ip.ToString();
}
}
return (ips != null && ips.Length > 0 ? ips[0] : new IPAddress(0x0)).ToString();
}
IPv4地址获取完后就可以进行服务的配置了,下面是配置代码。
private void StartServer()
{
System.Threading.ThreadPool.QueueUserWorkItem(delegate
{
try
{
isServerRun = true;
//获取本机IP
string ip = GetIP();
string tcpaddress = string.Format("net.tcp://{0}:{1}/Message/", ip, ServerPort);
//定义服务主机
ServiceHost host = new ServiceHost(typeof(MessageService), new Uri(tcpaddress));
//设置netTCP协议
NetTcpBinding tcpBinding = new NetTcpBinding();
tcpBinding.MaxBufferPoolSize = 2147483647;
tcpBinding.MaxReceivedMessageSize = 2147483647;
tcpBinding.MaxBufferSize = 2147483647;
//提供安全传输
tcpBinding.Security.Mode = SecurityMode.None;
//需要提供证书
tcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
//添加多个服务终结点
//使用指定的协定、绑定和终结点地址将服务终结点添加到承载服务中
//netTcp协议终结点
host.AddServiceEndpoint(typeof(IMessageService), tcpBinding, tcpaddress);
#region 添加行为
//元数据发布行为
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
//支持get请求
behavior.HttpGetEnabled = false;
//设置到Host中
host.Description.Behaviors.Add(behavior);
#endregion
/////这部分其实就是config配置文件。我不过是把它写在了代码里面,看大家的习惯了,个人感觉这样他有助于理解里面的字段
//设置数据交换类型
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
//启动服务
host.Open();
SetDisplayMessage(string.Format("服务启动成功,正在运行...\r\n{0}", tcpaddress));
}
catch (Exception ex)
{
SetDisplayMessage("服务启动失败");
MessageBox.Show(ex.Message, "服务启动失败,请检测配置中IP地址");
Environment.Exit(0);
}
});
}
3:使用WCF提供的配置工具进行,在工具下面有个WCF服务配置编辑器,进去按照步骤就可以进行配置。
以上是宿主程序的相关配置方法,接下来就是客户端的配置,客户端配置就比较简单。在客户端项目中右击添加服务引用,这时候确保宿主服务是在运行的状态,然后将宿主程序的地址给客户端地址,点击转到既可以进行客户端配置,然后右击就可以更新服务了。至此WCF配置部分结束。