复合类型的整数值在WCF操作时变为null

时间:2015-01-01 10:00:35

标签: c# wcf

我对WCF服务和c#有一个奇怪的行为;我正在尝试将复杂类型[FooRequest]发送到服务操作; [FooRequest]有一些属性,其中一个是用户定义类型[MyType],它只有字符串和整数这样的简单属性。

现在,当客户端传递包含y的[FooRequest]对象时,服务器接收除[MyType]内的整数和小数以外的完整参数。你能帮我解决吗?

服务合约:

[DataContract]
public enum MessageType
{
    [EnumMember]
    REQ1,
    [EnumMember]
    REQ2        
}

[MessageContract]
public class MyType 
{        
    [MessageHeader]
    public string Title { get; set; }

    [MessageHeader]
    public decimal DecValue { get; set; }

    [MessageHeader]
    public int IntValue { get; set; }
}

[MessageContract]
public class FooRequest
{        
    [MessageHeader]
    public int FooId { get; set; }

    [MessageHeader]
    public MessageType SomeEnum { get; set; }

    [MessageHeader]
    public List<MyType> SomeObject { get; set; }
}

在客户端:

        Svc.FooServiceClient client = new Svc.FooServiceClient();
        FooRequest req = new Svc.FooRequest()
        {
            FooId = 1,
            SomeEnum = MessageType.REQ1,
            SomeObject = (new List<MyType>() { new Svc.MyType() { Title = "txt txt", DecValue = 23.5, IntValue = 500 }}).ToArray()
        };
        FooResponse res = client.MyOperation(req );

在服务器端

public class FooService : IFooService
{
    public FooResponse MyOperation(FooRequest request)
    {
       /*
        request.FooId = 1
        request.SomeEnum  = REQ1
        request.SomeObject.Length = 1
        request.SomeObject[0].Title = "txt txt"
        request.SomeObject[0].DecValue = null ????!!!! here is the problem
        request.SomeObject[0].IntValue = null ????!!!! here is the problem
       */
    }
}

2 个答案:

答案 0 :(得分:0)

您错误地修饰了类型。而不是

[MessageContract]
public class FooRequest
{        
    [MessageHeader]
    public int FooId { get; set; }

应该是

[DataContract]
public class FooRequest
{        
    [DataMember]
    public int FooId { get; set; }

对MyType执行相同操作。所以你只需要改变属性。

答案 1 :(得分:0)

如果某人面临同样的问题,我找到了解决此问题的方法。使用[ServiceContract]将[XmlSerializerFormat]修饰添加到服务接口将解决该问题。我认为这是序列化的某种冲突问题。