重命名WCF服务契约文件后添加/更新服务引用出现400错误
刚踩过一模一样的坑!重命名服务契约文件后,WCF的元数据发布很容易因为引用、配置没同步跟上而报错,给你一步步排查的方案:
先检查服务端的契约引用是否完全更新
重命名文件后,很多人会忽略代码里的细节:比如你的服务实现类(比如MessengerService)里,是不是还在引用旧的契约接口名?或者命名空间有没有因为文件名修改而没同步?打开服务实现类,确认[ServiceBehavior]关联的契约,以及所有using语句都指向了新的契约文件和命名空间,别留旧的残留。核对服务配置文件的契约指向
打开服务端的App.config(或Web.config),找到<system.serviceModel>下的<services>节点,检查对应服务的contract属性是不是完全匹配更新后的契约全限定名(命名空间+接口名)。比如原来的contract="MyOldNamespace.IMessenger"要改成contract="MyNewNamespace.IMessenger"(如果改了命名空间的话)。
同时确认元数据交换端点的配置没写错:<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>这里的
contract必须是IMetadataExchange,绝对不能写错。另外也要确保<serviceBehaviors>里开启了元数据发布:<serviceMetadata httpGetEnabled="true"/>清理+重新生成,重启服务宿主
别小看编译缓存!先右键服务端项目→清理,删掉bin/obj目录里的旧文件,然后重新生成整个解决方案。如果是用VS自带的WCF服务宿主,关掉它再重新启动;如果是自宿主程序,务必重启进程——很多时候旧的dll还在内存里运行,导致元数据还是旧的。手动验证元数据是否正常
直接在浏览器里访问你的元数据地址:http://localhost:8733/Design_Time_Addresses/MessengerService/MessengerService/mex/$metadata。如果浏览器返回400,说明服务端的元数据生成确实有问题,回到前面的步骤再查;如果能正常显示XML,那就是客户端的缓存问题——删掉旧的服务引用,清理客户端项目的bin/obj,再重新添加引用试试。排查残留的旧文件或配置
有时候重命名后,项目里可能还残留着旧的契约文件(比如没彻底删除),或者配置文件里有旧的服务节点没删掉,这些都会干扰WCF的元数据生成。仔细检查项目文件列表和配置文件,把没用的旧内容清掉。
一般按这个流程走,就能解决大部分重命名契约后的元数据报错问题。
内容的提问来源于stack exchange,提问作者user8531685

