我遇到了一个奇怪的问题:我有一个需要在独立控制台应用程序上通过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以支持此合同。
答案 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");