You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 08:20:37