2015-05-05 28 views
2

我正在以编程方式创建一个命名管道WCF服务和客户端。为什么“在配置元素集合中找不到与键匹配的元素”?

服务代码执行:

serviceHost = new ServiceHost(typeof(CFCAccessPointService), new Uri(Names.Address)); 
serviceHost.AddServiceEndpoint(typeof (ICfcAccessPoint), new NetNamedPipeBinding(Names.Binding), Names.Contract); 
serviceHost.Open(); 

客户端代码:

var ctx = new InstanceContext(new StatusHandler()); 
s_proxy = new DuplexChannelFactory<ICfcAccessPoint>(ctx, new NetNamedPipeBinding(Names.Binding), new EndpointAddress(Names.Address)); 

public static class Names 
{ 
    public const string Address = "net.pipe://localhost/CFC/Plugins/GuestAccessService"; 
    public const string Binding = "netNamedPipeBinding_ICfcAccessPoint"; 
    public const string Contract = "GuestAccessClientServerInterface.ICfcAccessPoint"; 
} 

,以确保客户端和服务保持不变。

但是,如果我删除Names.Binding,以便没有指定绑定配置,则会出现在端点上找不到侦听器的错误。如果我包含它,我会得到“在配置元素集合中找不到与密钥匹配的元素”...

我没有使用.config文件。

还缺什么?

回答

1

无论如何,绑定都很好,事实上根本就不需要任何参数。

问题在于合同。当我改成代码:

public static class Names 
{ 
    public const string Address = "net.pipe://localhost/CFC/Plugins/GuestAccessService/"; 
    public const string Binding = ""; 
    public const string Contract = "CfcAccessPoint"; 
} 

,并在服务端:

this.serviceHost.AddServiceEndpoint(typeof(ICfcAccessPoint), new NetNamedPipeBinding(), Names.Contract); 

,并在客户端:

var ctx = new InstanceContext(this); 
proxy = new DuplexChannelFactory<ICfcAccessPoint>(ctx, new NetNamedPipeBinding(), new EndpointAddress(Names.Address) + Names.Contract); 

那么事情的罚款。该服务只是命名管道;客户端将地址添加到管道名称。

Voilá!

1

这意味着在配置文件中没有与该名称的绑定。既然你已经声明你没有使用配置文件,这并不奇怪。在Web.config或app.config中配置WCF端点是不可能的吗?这只是我的看法,但是当我需要对服务的各个属性进行随机调整时,我发现配置方法更加灵活。

无论哪种方式,MSDN docsNetNamedPipeBinding(string)构造函数,签名是这样的:

public NetNamedPipeBinding(
    string configurationName 
) 

这意味着,只有这样,才能实例化此构造一个NetNamedPipeBinding需要一个有名称的字符串匹配结合存在于你的web.config或app.config文件中。这将是这个样子:

<system.serviceModel> 
    <bindings> 
     <netNamedPipeBinding> 
      <binding name="netNamedPipeBinding_ICfcAccessPoint" /> 
     <netNamedPipeBinding> 
    </bindings> 
</system.serviceModel> 

您可能正在寻找它看起来更像这样的构造:

public NetNamedPipeBinding(
    NetNamedPipeSecurityMode securityMode 
) 

这里是MSDN链接。

使用此构造方法,您的服务主机代码将looke更多这样的:

serviceHost = new ServiceHost(typeof(CFCAccessPointService), new Uri(Names.Address)); 
serviceHost.AddServiceEndpoint(typeof (ICfcAccessPoint), new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), Names.Contract); 
serviceHost.Open(); 

而且这样你的客户端代码:

var ctx = new InstanceContext(new StatusHandler()); 
s_proxy = new DuplexChannelFactory<ICfcAccessPoint>(ctx, new NetNamedPipeBinding(NetNamedPipeSecurityMode.None), new EndpointAddress(Names.Address)); 

这应该避免对配置文件的需要。

+0

对不起,但没有任何建议工作。当我修改代码来设置安全模式时,我得到了无听者错误。添加配置文件完全没有区别。 – shipr

相关问题