代码问题中的WCF Tcp绑定

时间:2017-09-05 13:16:51

标签: c# wcf tcp binding

我遇到了一个奇怪的问题:我有一个需要在独立控制台应用程序上通过tcp协议托管的wcf服务。

我创建了一个新的控制台应用程序项目,并为我的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以支持此合同。

1 个答案:

答案 0 :(得分: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");
相关问题