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

Jef*_*eff 7 c# wcf serialization web-services 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; }
}
Run Code Online (Sandbox Code Playgroud)

而且服务界面很简单:

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

第二两个参数strvalueintvalue添加只用于故障排除,看看那些都拿到反序列化-他们.当我点击该服务时,我收到一条错误消息,说我错过Category1了请求中的参数,但正如您可以看到这个Fiddler屏幕截图所示,值就在那里.

提琴手截图

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

UPDATE

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

M.R*_*.R. 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")]


Six*_*aez 5

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

更新:更仔细地查看XML,XML中不应该有QuizServiceArgs元素吗?