2017-09-05 56 views
0

我有一个奇怪的问题:我有一个wcf服务需要在独立的控制台应用程序上由tcp协议托管。代码中的WCF Tcp绑定问题

我已经创建了一个新的控制台应用程序项目,并为我的wcf项目添加了一个lib引用。当我想配置和广播主机时会发生问题。

var Uri = new Uri("net.tcp://myaddress:4322/MyService"); 
     MyServiceHost = new ServiceHost(typeof(ImyService), Uri); 

     var binding = new NetTcpBinding(); 
     MyServiceHost.AddServiceEndpoint(typeof(IImageExchangeService), binding, ""); 


     var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding(); 
     MyServiceHost.AddServiceEndpoint(typeof(IMetadataExchange),mexBinding, ""); 



     ServiceMetadataBehavior serviceBehavior = new ServiceMetadataBehavior(); 
     serviceBehavior.HttpGetEnabled = true; 
     serviceBehavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 
     MyServiceHost.Description.Behaviors.Add(serviceBehavior); 

当谈到开主机,我得到这个消息:

合同名称“IMetadataExchange接口”可以 不是由服务WcfService.Ser 执行合同的名单中找到vices.MyService。将ServiceMetadataBehavior添加到配置 文件或直接添加到ServiceHost以启用对此合同的支持。

+0

我会强烈建议写一个好'app.config'文件,那就是你有过绑定和行为的更多控制...... –

回答

1

现在我有更好的时间来检查这一点。

首先,您需要从主机获取服务行为或创建一个新的服务并添加它,如果未找到。

设置HttpGetEnabled需要您还将元数据URI添加到基址。

此外,只要所添加的所有端点都具有唯一的名称,元数据端点是否被命名为“mex”似乎并不重要。所以你不能为两个端点使用空字符串。

var Uri = new Uri("net.tcp://myaddress:4322/MyService"); 
var MetadataUri = new Uri("http://myaddress:8000/MyService"); 
var MyServiceHost = new ServiceHost(typeof(MyService), Uri, MetadataUri); 

var serviceBehavior = MyServiceHost.Description.Behaviors.Find<ServiceMetadataBehavior>(); 
if (serviceBehavior == null) 
{ 
    serviceBehavior = new ServiceMetadataBehavior(); 
    MyServiceHost.Description.Behaviors.Add(serviceBehavior); 
} 

serviceBehavior.HttpGetEnabled = true; 
serviceBehavior.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; 

MyServiceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); 

var binding = new NetTcpBinding(); 
MyServiceHost.AddServiceEndpoint(typeof(IImageExchangeService), binding, "image"); 
+0

还有就是根本没有影响。 – Asvv

+0

用工作代码示例编辑我的答案。 –

+0

非常感谢它的解决方案。 – Asvv