WCF服务配置正确命名空间仍使用tempuri.org导致反序列化错误如何解决
问题原因
该命名空间不匹配问题核心是WCF的ServiceContract特性默认使用http://tempuri.org/作为契约命名空间,你当前代码中添加的WebServiceBindingAttribute属于ASP.NET Web Services(ASMX)的兼容特性,WCF服务运行时不会优先读取该特性的命名空间配置。
解决方案
按以下步骤修改即可解决:
- 第一步:给
[ServiceContract]特性显式指定命名空间
修改契约接口的ServiceContract特性定义:
// 原有写法 [ServiceContract] // 修改为 [ServiceContract(Namespace = "http://xx.com/fake/1.0")]
你代码中保留的[WebMethodAttribute]、[SoapDocumentMethodAttribute]都是ASMX时代的特性,在WCF服务中可以移除,改用WCF原生配置即可,减少兼容冲突。
- 第二步:给操作契约显式指定Action配置
避免WCF自动生成的Action地址不匹配,修改OperationContract特性:
[OperationContract(Action = "http://xx.com/fake/1.0/notifyEvent", ReplyAction = "*")]
- 第三步:检查数据契约的命名空间配置
确认NotifyEventRequest、NotifyEventResponse等关联数据类上的[XmlType]或[DataContract]特性,也配置了相同的http://xx.com/fake/1.0命名空间,避免消息体部分反序列化失败。 - 可选全局配置:如果有多个服务需要统一命名空间,可以直接在配置文件的服务行为中添加全局配置
修改.config的serviceBehaviors节点:
<behavior> <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" /> <serviceDebug includeExceptionDetailInFaults="true" /> <!-- 新增全局命名空间配置 --> <serviceNamespaces namespace="http://xx.com/fake/1.0" /> </behavior>
验证方法
修改完成后可临时把serviceMetadata的httpsGetEnabled设置为true,访问服务地址+?wsdl,查看wsdl中的targetNamespace是否已经替换为自定义命名空间,确认配置生效后再改回false即可。
内容的提问来源于stack exchange,提问作者DavidWaldo
相关产品推荐
相关产品推荐

