WCF反序列化的对象属性的空值

时间:2011-05-02 17:34:01

标签: c# wcf web-services serialization deserialization

我有一个使用的WCF Web服务正常工作。在某个地方,它停了下来,我不知道为什么。代码和接口从未改变过web.config(至少与web服务部分无关)。我有一节课:

[DataContract]
public class QuizServiceArgs
{
    [DataMember(IsRequired = true, Order = 1)] 
    public int Category1 { get; set; }

    [DataMember(IsRequired = true, Order = 2)] 
    public int Category2 { get; set; }

    [DataMember(IsRequired = true, Order = 3)] 
    public int Category3 { get; set; }

    [DataMember(IsRequired = true, Order = 4)] 
    public int Category4 { get; set; }
}

服务界面很简单:

public interface IQuizService
{
    [OperationContract]
    [WebInvoke(Method = "POST",
       BodyStyle = WebMessageBodyStyle.WrappedRequest,
       ResponseFormat = WebMessageFormat.Json)]
    ServiceResult Save(QuizServiceArgs answers, string strvalue, int intvalue);
}

后两个参数strvalueintvalue仅用于进行故障排除,以确定是否进行了反序列化 - 它们是。当我点击服务时,我收到一条错误消息,说我错过了请求中的Category1参数,但正如您可以看到此Fiddler屏幕截图所示,值就在那里。

fiddler screenshot

我可以获取要传入的原始值,但是对象似乎都使用null或默认值进行实例化。我做错了什么?

更新

我从来没有真正回答过我的原始问题很糟糕,但Sixto建议我将序列化切换为JSON。 JSON是最初的设计,但是当我遇到问题时它就被搞定了。在我成功切换回JSON之后,所有内容都正确地进行了序列化和反序列化。现在我只是等待这个没有解释,所以我可以切换回XML ....

2 个答案:

答案 0 :(得分:8)

您遇到了命名空间问题。默认情况下,为servicecontract创建接口时,会为其分配命名空间。命名空间就像SOAP xml元素的范围,如果它不属于同一范围,它认为它不存在。有可能是发布停止提供命名空间(?)的代码。在发布XML时你必须通过它来引用它 - 但我不完全确定它分配了什么(特定于服务器),因此总是定义命名空间是一种好习惯,如下所示:


[ServiceContract(Namespace = "your namespace")]
public interface IQuizService 
{     
     [OperationContract]     
     [WebInvoke(Method = "POST",        
            BodyStyle = WebMessageBodyStyle.WrappedRequest,        
            ResponseFormat = WebMessageFormat.Json)]     
            ServiceResult Save(QuizServiceArgs answers, string strvalue, 
                int intvalue); 
} 

然后帖子应该在SOAP请求中具有命名空间。


<Save xmlns="your namespace">.....</Save>

命名空间也应该与web.config中的服务声明相匹配。

还需要在datacontract

中使用它

[DataContract(Namespace = "your namespace")]

答案 1 :(得分:5)

DataMember IsRequired 属性告诉WCF反序列化程序预期消息XML中具有该名称的元素(至少它用于soap反序列化)。听起来生成消息请求的客户端代码不再发送所有Category ...元素。这并不意味着你不能为标记为IsRequired的DataMember发送空值,它只是意味着元素需要存在于消息中。

更新:更仔细地查看XML,XML中是否应该有一个QuizServiceArgs元素?