C# WCF仅返回具有默认值的对象

C# WCF仅返回具有默认值的对象,c#,wcf,C#,Wcf,我有一个测试类CustObject,它具有DataContract和DataMember属性。但是,当我将其返回给客户机时,所有值都是默认值 服务方: [DataContract] public class CustObject { [DataMember (IsRequired = true)] public int n1; [DataMember (IsRequired = true)] public int n2; [DataMember]

我有一个测试类CustObject,它具有DataContract和DataMember属性。但是,当我将其返回给客户机时,所有值都是默认值

服务方:

[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();
}
客户端:

    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 ();
    }
}
输出值只有0,0,0,0,0,最后一个值是空字符串

为了解决这个问题,我读了很多书。看起来,即使值已初始化,xml转换也只是给每个字段一个默认值。我不明白为什么


我使用svutil创建代理文件。

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


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

一整天之后,我找到了解决方案。这可能适用于所有使用Mono的用户!非常有用的解决方案

我使用的是Mono,并且至少在ubuntu上使用的svutil for Mono生成的输出代码是正确的,除了一个特别重要的点

自定义类的代理类必须包含在与服务中定义的实际自定义类相同的命名空间中

对于上面的示例,在svutil生成的output.cs文件中,我必须用服务名称空间包围代理CustObject


我通过在Windows中运行.NET版本的svutil并比较生成的代码文件来解决这个问题。我想说这可能是Mono的svutil中的一个bug。

如果您尝试发送一个自定义值而不是默认值的对象,它是否工作正常?不,它不工作。查看上面的CustObject类,这些值都已设置,但返回的数据都是默认值。是的,我看到了,但您是否尝试发送带有自定义值的对象,我认为了解自定义值是否不会被序列化很重要;是一个自定义值。因此,我不知道你的意思。这个对象有自定义值。我的意思是,当你创建你的对象之后,你设置了一些属性,而不是使用你在对象声明中写的属性。这只是简单的测试。我已经多次运行svutil并重新编译,只是为了确保它不是我正在做的事情。不过,这是一个很好的建议。很高兴知道。仅供参考,使用ChannelFactory而不是生成的代理应该可以避免这一问题。奇怪的是,它不会引发异常或可能被编译器捕获。原因是这样做是为了保护您的应用程序不受第三方WCF服务更改的影响。我不喜欢因为对服务的更改而中断生产应用程序,这些更改可能很重要,也可能不重要。异常或编译器警告的问题在于Visual Studio不知道当前解决方案中的服务与外部服务之间的区别。