WCF Web服务配置出现重复键警告,请求排查提示
首先先把你的WCF配置贴出来方便参考:
<system.serviceModel> <bindings> <basicHttpBinding> <binding maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:03:00" sendTimeout="00:03:00"> <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="200000" maxNameTableCharCount="2147483647" /> </binding> </basicHttpBinding> </bindings> <client> <endpoint address="http://webserver/myService.svc" binding="basicHttpBinding" contract="IService" name="IService" /> <endpoint address="http://webserver/myService1.svc" binding="basicHttpBinding" contract="Documents.IDocService" name="Documents.IDocService" /> </client> <behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="false" /> </behavior> </serviceBehaviors> </behaviors> <protocolMapping> <add scheme="http" binding="basicHttpBinding" /> </protocolMapping> </system.serviceModel>
关于你遇到的“配置系统检测到不同配置范围中的重复键”警告,虽然你在自己的配置里看不到重复,但WCF的配置是分层加载的,重复项很可能来自你没注意到的地方,给你几个具体的排查方向:
检查machine.config里的默认配置:.NET的machine.config里默认已经定义了一些protocolMapping项,比如http协议默认映射到basicHttpBinding。你可以去对应.NET版本的配置目录找这个文件(比如
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config,64位就找Framework64目录),搜索<protocolMapping>节点,看看是不是已经存在scheme="http"的条目。如果有的话,你自己配置里再加就会触发重复警告。排查配置文件的继承与合并:如果是Web服务,要检查网站根目录和子目录的web.config有没有重复的protocolMapping;如果是桌面应用,看看有没有通过
configSource属性引入的外部配置文件,这些文件里可能也定义了相同的映射。检查代码中的动态配置:有时候开发人员会在代码里手动添加协议映射,比如通过
ServiceHost的配置或者ConfigurationManager修改配置集合。你可以检查服务启动相关的代码,有没有类似protocolMappings.Add("http", typeof(BasicHttpBinding))这样的代码,这会和配置文件里的项冲突。用工具辅助诊断:试试WCF自带的配置编辑器(SvcConfigEditor.exe),打开你的配置文件后,它会自动检测并标记重复的配置项。另外,也可以在调试时加载配置,查看
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None).GetSection("system.serviceModel/protocolMapping")的内容,看看里面的条目来源,能帮你定位到重复的配置段。临时移除测试:把你配置里的
<protocolMapping>节点注释掉,重启服务看看警告是否消失。如果消失了,说明确实是这个节点和其他配置范围的条目重复;如果警告还在,那得去别的配置段找问题。
内容的提问来源于stack exchange,提问作者DanielV

