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)
第二两个参数strvalue
和intvalue
添加只用于故障排除,看看那些都拿到反序列化-他们.当我点击该服务时,我收到一条错误消息,说我错过Category1
了请求中的参数,但正如您可以看到这个Fiddler屏幕截图所示,值就在那里.
我可以获取传入的原始值,但是对象似乎都使用null或default值进行实例化.我究竟做错了什么?
我从来没有真正回答过我的原始问题很糟糕,但Sixto建议我将序列化切换为JSON.JSON是最初的设计,但是当我遇到问题时它就被搞定了.在我成功切换回JSON之后,所有内容都正确地进行了序列化和反序列化.现在我只是等待这个打破没有解释所以我可以切换回XML ....
您有一个命名空间问题.默认情况下,为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")]
DataMember IsRequired属性告诉WCF反序列化器期望消息XML中具有该名称的元素(至少它用于soap反序列化).听起来生成消息请求的客户端代码不再发送所有Category ...元素.这并不意味着你不能为标记为IsRequired的DataMember发送空值,它只是意味着元素需要存在于消息中.
更新:更仔细地查看XML,XML中不应该有QuizServiceArgs元素吗?
归档时间: |
|
查看次数: |
12345 次 |
最近记录: |