C# 为什么;在配置元素集合“中未找到与键匹配的元素”;?

C# 为什么;在配置元素集合“中未找到与键匹配的元素”;?,c#,wcf-binding,C#,Wcf Binding,我正在以编程方式创建命名管道WCF服务和客户端 服务代码包括: serviceHost = new ServiceHost(typeof(CFCAccessPointService), new Uri(Names.Address)); serviceHost.AddServiceEndpoint(typeof (ICfcAccessPoint), new NetNamedPipeBinding(Names.Binding), Names.Contract); serviceHost.Open()

我正在以编程方式创建命名管道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));
确保客户和服务保持不变

但是如果我删除Names.Binding,因此没有指定绑定配置,那么我会得到一个错误,即在端点处找不到侦听器。如果我包括它,我会得到“在配置元素集合中找不到与键匹配的元素”

我没有使用.config文件


还缺少什么?

这意味着配置文件中没有使用该名称的绑定。既然您已经声明不使用配置文件,这就不足为奇了。是否存在无法在web.config或app.config中配置WCF端点的原因?这只是我的观点,但我发现当我需要对服务的各个属性进行随机调整时,配置方法要灵活得多

无论哪种方式,对于
NetNamedPipeBinding(string)
构造函数,签名如下所示:

public NetNamedPipeBinding(
    string configurationName
)
<system.serviceModel>
    <bindings>
        <netNamedPipeBinding>
            <binding name="netNamedPipeBinding_ICfcAccessPoint" />
        <netNamedPipeBinding>
    </bindings>
</system.serviceModel>
public NetNamedPipeBinding(
    NetNamedPipeSecurityMode securityMode
)
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));
这意味着,使用此构造函数实例化
NetNamedPipeBinding
的唯一方法要求web.config或app.config文件中存在名称与该字符串匹配的绑定。看起来是这样的:

public NetNamedPipeBinding(
    string configurationName
)
<system.serviceModel>
    <bindings>
        <netNamedPipeBinding>
            <binding name="netNamedPipeBinding_ICfcAccessPoint" />
        <netNamedPipeBinding>
    </bindings>
</system.serviceModel>
public NetNamedPipeBinding(
    NetNamedPipeSecurityMode securityMode
)
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));
这里是链接

使用此构造函数,您的服务主机代码看起来更像:

public NetNamedPipeBinding(
    string configurationName
)
<system.serviceModel>
    <bindings>
        <netNamedPipeBinding>
            <binding name="netNamedPipeBinding_ICfcAccessPoint" />
        <netNamedPipeBinding>
    </bindings>
</system.serviceModel>
public NetNamedPipeBinding(
    NetNamedPipeSecurityMode securityMode
)
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));
您的客户端代码如下所示:

public NetNamedPipeBinding(
    string configurationName
)
<system.serviceModel>
    <bindings>
        <netNamedPipeBinding>
            <binding name="netNamedPipeBinding_ICfcAccessPoint" />
        <netNamedPipeBinding>
    </bindings>
</system.serviceModel>
public NetNamedPipeBinding(
    NetNamedPipeSecurityMode securityMode
)
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));
var ctx=newinstancecontext(newstatushandler());
s_proxy=新的DuplexChannelFactory(ctx,新的NetNamedPipeBinding(NetNamedPipeSecurityMode.None),新的EndpointAddress(Names.Address));

这样就不需要配置文件了

无论哪种方式,绑定都很好,实际上根本不需要任何参数

问题在于合同。当我将代码更改为:

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);
var ctx=新的InstanceContext(此);
代理=新的DuplexChannelFactory(ctx,新的NetNamedPipeBinding(),新的EndpointAddress(Names.Address)+Names.Contract);
然后一切顺利。服务只是命名管道;客户端将地址添加到管道名称中


对不起,两个建议都不起作用。当我修改代码以设置安全模式时,出现了无侦听器错误。添加配置文件没有任何区别。