使用Channel Factory调用WCF服务返回对象属性值异常求助
问题:Channel Factory调用WCF服务返回日期字段为默认值01/01/0001
首次尝试用Channel Factory调用远程WCF服务的GetVrindassStatusAndDate方法,返回的Vrindassinfo对象中VrindassDate和VrindassDateTime字段均为01/01/0001,而非服务应返回的当前日期。相关代码及WSDL片段如下:
相关代码
IVrindassDigitalService.cs
public interface IVrindassDigitalService { Vrindassinfo GetVrindassStatusAndDate(); }
VrindassDigitalService.cs
public class VrindassDigitalService: IVrindassDigitalService { public Vrindassinfo GetVrindassStatusAndDate() { BasicHttpBinding myBinding = new BasicHttpBinding(); Vrindassinfo result = new Vrindassinfo(); try { EndpointAddress myEndpoint = new EndpointAddress("http://svc-server/OnlineDataStore.svc"); ChannelFactory<IVrindassDigitalChannel> myChannelFactory = new ChannelFactory<IVrindassDigitalChannel>(myBinding, myEndpoint); // Create a channel IVrindassDigitalChannel wcfClient = myChannelFactory.CreateChannel(); result = wcfClient.GetVrindassStatusAndDate(); } catch (Exception ex) { } return result; } }
Vrindassinfo类
public partial class Vrindassinfo { public System.DateTime VrindassDate { get; set; } public System.DateTime VrindassDateTime { get; set; } public bool isActive { get; set; } }
WSDL片段
<wsdl:portType name="Utility"> <wsdl:operation name="GetVrindassStatusAndDate"> <wsdl:input wsaw:Action="http://tempuri.org/Utility/GetVrindassStatusAndDate" message="tns:Utility_GetVrindassStatusAndDate_InputMessage"/> <wsdl:output wsaw:Action="http://tempuri.org/Utility/GetVrindassStatusAndDateResponse" message="tns:Utility_GetVrindassStatusAndDate_OutputMessage"/> </wsdl:operation> ….. <wsdl:binding name="BasicHttpBinding_Utility" type="tns:Utility"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="GetVrindassStatusAndDate"> <soap:operation soapAction="http://tempuri.org/Utility/GetVrindassStatusAndDate" style="document"/> ………….
调用代码
//get Vrindass date Vrindassinfo VrindassInfo = _VrindassDigitalService.GetVrindassStatusAndDate();
排查与解决方案
1. 修正服务契约接口的匹配性
从WSDL可知,服务端portType为Utility,但客户端接口未指定命名空间和SOAP Action,导致WCF无法正确匹配服务操作。修改客户端接口如下:
[ServiceContract(Namespace = "http://tempuri.org/")] public interface IVrindassDigitalChannel { [OperationContract(Action = "http://tempuri.org/Utility/GetVrindassStatusAndDate", ReplyAction = "http://tempuri.org/Utility/GetVrindassStatusAndDateResponse")] Vrindassinfo GetVrindassStatusAndDate(); }
注意:接口名需与
ChannelFactory中使用的IVrindassDigitalChannel一致,命名空间、Action必须与WSDL完全匹配。
2. 捕获并查看异常详情
当前catch块为空,无法得知调用过程中是否出现异常(如契约不匹配、网络问题),异常会导致返回默认初始化的Vrindassinfo对象(DateTime默认值为01/01/0001)。修改catch块:
catch (Exception ex) { // 替换为日志记录逻辑 Console.WriteLine($"调用WCF服务出错:{ex.Message}\n{ex.StackTrace}"); // 抛出异常避免返回错误默认值 throw; }
3. 验证数据契约字段映射
检查Vrindassinfo类的字段名称、类型是否与WSDL定义完全一致(包括大小写),字段不匹配会导致反序列化失败。建议用SvcUtil工具自动生成客户端契约和数据类:
svcutil.exe http://svc-server/OnlineDataStore.svc?wsdl
生成的代码会自动匹配服务端结构,消除手动编写的偏差。
4. 匹配服务端绑定配置
默认BasicHttpBinding可能与服务端配置不兼容,需根据服务端设置调整绑定:
BasicHttpBinding myBinding = new BasicHttpBinding(); // 示例:若服务端无安全验证 myBinding.Security.Mode = BasicHttpSecurityMode.None; myBinding.MessageEncoding = WSMessageEncoding.Text;
5. 验证服务端实际返回值
用Postman、SoapUI等工具直接调用WCF服务,查看返回XML中的日期字段是否正确。若服务端返回默认日期,问题在服务端;若返回正确,再排查客户端反序列化问题。
内容的提问来源于stack exchange,提问作者Bench
相关产品推荐
相关产品推荐

