将WCF NetTcpBinding设置为只接受本地连接时出错

问题描述:

我试图设置一个WCF服务,它只接受来自其本身的传入消息/连接。将WCF NetTcpBinding设置为只接受本地连接时出错

我已经能够成功地创建服务,并运行它,并使用此代码来创建WCF端点与它通信(不仅限于本地主机)当我加入这一行

NetTcpBinding binding = new NetTcpBinding(); 
binding.Security.Mode = SecurityMode.None; 
_host = new ServiceHost(this, new Uri("net.tcp://localhost:19852")); 
_host.Description.Behaviors.Add(new ServiceMetadataBehavior()); 
_host.AddServiceEndpoint(typeof(ISyncClient), binding, "SyncService"); 
_host.AddServiceEndpoint(typeof(IMetadataExchange), System.ServiceModel.Description.MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); 
_host.Open(); 

限制连接从本地主机

binding.HostNameComparisonMode = HostNameComparisonMode.Exact; 

我得到这个例外

System.ServiceModel.AddressAlreadyInUseException:已经有IP端点上的监听器0.0.0.0:19852。如果另一个应用程序已在此端点上侦听,或者您的服务主机中有多个具有相同IP端点但具有不兼容绑定配置的服务端点,则可能会发生这种情况。 ---> System.Net.Sockets.SocketException:通常只允许使用每个套接字地址(协议/网络地址/端口)

我甚至不确定我在做什么是限制WCF访问,但显然它不起作用。对我而言,这看起来像是与MEX端点的某种冲突。据我所知,我需要mex端点,所以我无法摆脱它。任何人都指向我的解决方案?

+0

当你说“设置一个WCF服务只接受来自它自己的消息/连接”你是什么意思。我不确定我明白你为什么要这样做?当然,如果你想给自己发一条消息,你可以通过proc而不是通过WCF频道来完成。无论如何,您是否检查过该端口号是否已被其他服务使用? – stephenl

+0

@stephenl我的意思是我希望服务只接受来自同一台机器的连接。 –

执行此操作的简单方法是使用命名管道绑定。它只支持本地通话。从Choosing a Transport

当不同的WCF应用程序之间需要 台计算机上的沟通,并要防止 另一台机器上的任何信息,然后使用命名管道运输。

此外,Mex点是完全可选的。您可以毫无问题地摆脱其端点和行为。

+0

当我试图使用WcfTestClient.exe测试服务时,没有mex端点就看不到它。 –

+0

此外,使用命名管道绑定不是这个应用程序的选项(说我的领导) –

+0

这是为什么?这正是它的目的。顺便说一句,WcfTestClient需要mex端点,因为它没有办法保存配置(不像你的应用程序)。 – stephenl