学校项目中更新WCF服务引用遇HTTP 400错误及元数据解析问题
我之前帮不少开发者踩过WCF元数据配置的坑,咱们一步步来拆解你遇到的问题:
先修正端口号的手误!
你报错里的两个URL明显有端口不一致的问题:一个是http://localhost:510444/Service1.svc/$metadata(多了一位数字),另一个是http://localhost:51044/Service1.svc。先确认你的WCF服务实际运行的端口——可以看服务调试时的控制台输出,或者配置文件里的baseAddress,把服务引用的URL改成完全匹配的正确地址,这大概率是触发400错误的首要原因。检查服务端元数据发布配置
确保你的WCF服务配置文件(web.config/app.config)里已经正确开启了元数据发布,核心配置要包含这几部分:<system.serviceModel> <services> <service name="你的服务命名空间.Service1"> <!-- 业务服务端点 --> <endpoint address="" binding="basicHttpBinding" contract="你的服务命名空间.IService1"/> <!-- 必须的元数据交换端点 --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <host> <baseAddresses> <add baseAddress="http://localhost:51044/Service1.svc"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors> <behavior> <!-- 开启HTTP方式获取元数据 --> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>重点确认:
serviceMetadata的httpGetEnabled设为true,且存在mex端点,绑定为mexHttpBinding、契约为IMetadataExchange。匹配服务端与客户端的绑定类型
报错里提到服务不支持application/soap+xml; charset=utf-8,这个内容类型是wsHttpBinding默认使用的;如果你的服务端用的是basicHttpBinding,它默认用的是text/xml。所以要确保客户端配置里的绑定类型和服务端完全一致——服务端用basicHttpBinding,客户端也对应配置成basicHttpBinding,反之亦然。手动验证元数据地址
打开浏览器,输入修正后的元数据URL(比如http://localhost:51044/Service1.svc/$metadata),如果能正常加载出XML格式的元数据内容,说明服务端的元数据发布没问题;如果还是返回400,那继续回头检查服务端的配置和服务运行状态。清理旧引用,重新添加
有时候旧的服务引用缓存会导致奇怪的问题,先删除客户端项目里的旧服务引用,然后重新添加,输入正确的服务地址再试一次。
内容的提问来源于stack exchange,提问作者Robbe

