我有一个使用的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);
}
后两个参数strvalue
和intvalue
仅用于进行故障排除,以确定是否进行了反序列化 - 它们是。当我点击服务时,我收到一条错误消息,说我错过了请求中的Category1
参数,但正如您可以看到此Fiddler屏幕截图所示,值就在那里。
我可以获取要传入的原始值,但是对象似乎都使用null或默认值进行实例化。我做错了什么?
我从来没有真正回答过我的原始问题很糟糕,但Sixto建议我将序列化切换为JSON。 JSON是最初的设计,但是当我遇到问题时它就被搞定了。在我成功切换回JSON之后,所有内容都正确地进行了序列化和反序列化。现在我只是等待这个没有解释,所以我可以切换回XML ....
答案 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元素?