WCF 返回只有默认值的对象

Ben*_* B. 2 c# wcf

我有一个CustObject具有DataContractDataMember属性的测试类。但是,当我将此返回给客户端时,所有值都是默认值。

服务端:

[DataContract]
public class CustObject
{
    [DataMember (IsRequired = true)]
    public int n1;
    [DataMember (IsRequired = true)]
    public int n2;

    [DataMember]
    public int val1 = 552;

    [DataMember]
    public int? val2 = 88;

    [DataMember]
    int val3 = 11;

    [DataMember]
    string val4 = "hello world";


    public CustObject()
    {
        n1 = 1;
        n2 = 2;
    }

    private int nprivate = 18;



}



    public class CalculatorService : ICalculator
{

    public CustObject Foo()
    {
        Console.WriteLine();
        CustObject test =  new CustObject();
        Console.WriteLine("Should read that n1 = {0} and n2 = {1}", test.n1, test.n2);
        return test;
    }
}

[ServiceContract]
public interface ICalculator
{
    [OperationContract]
    CustObject Foo();
}
Run Code Online (Sandbox Code Playgroud)

客户端:

    public static void Main ()
    {
        CalculatorClient client = new CalculatorClient(
                                      new WSHttpBinding(SecurityMode.None),
                                       new EndpointAddress("http://localhost:8000/ServiceModelSamples/Service/CalculatorService"));



        CustObject custObj = client.Foo();
        Console.WriteLine(custObj.val1 + ", " + custObj.val2 + ", " + custObj.val1 + ", " + custObj.val2 + ", " +
                          custObj.val3 + ", " + custObj.val4);

        //Step 3: Closing the client gracefully closes the connection and cleans up resources.
        client.Close ();


        Console.WriteLine ();
        Console.WriteLine ("Press <ENTER> to terminate client.");
        Console.ReadLine ();
    }
}
Run Code Online (Sandbox Code Playgroud)

并且输出只是0, 0, 0, 0, 0,(最后一个值是一个空字符串)

我已经阅读了大量的东西来试图找出这个问题。似乎即使这些值已初始化,xml 转换也只是为每个字段提供了一个默认值。我不明白为什么。

我使用 svutil 创建代理文件。

cad*_*ll0 5

使用生成的代理的问题之一,无论是通过 svutil 还是添加服务引用,都是更新您的服务。任何时候我发现我没有在字段中获得预期值,这是因为我更改了服务中的某些内容并且没有重新生成我的代理代码。如果您重命名属性(甚至更改大小写),或更改数据类型,而不是抛出异常,您只会获得该数据类型的默认值。再次尝试运行 svutil。

注意:这是我停止使用生成的代理并现在使用 ChannelFactory 连接到 WCF 的原因之一。