我正在尝试将我们的Web服务方法作为REST(json)服务。我在web.config上做了一些配置,然后将属性添加到Web服务的功能中,如下所示。
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "Echo")]
ResultSet<EchoObj> GetEcho(string sth);
它也有这样的实现:
public ResultSet<EchoObj> GetEcho(string sth)
{
ResultSet<EchoObj> obj = new ResultSet<EchoObj>();
obj = DoSomeWork();
if(obj.IsOk)
{
obj.Item = new EchoObj();
obj.Item.Sound = "My Sound";
obj.Item.Volume = Volume.High;
} else
{
obj.ErrorDesc = "Sound not found.";
}
return obj;
}
这里,如果obj有错误,它会正确返回响应。如果obj没问题,那么它就不会有任何反应。我确信,它是由于序列化错误引起的。
ResultSet和EchoObj类如下:
ResultSet类:
[DataContract(Name = "ResultSet")]
public class ResultSet<T> where T : class
{
[DataMember()]
public bool IsOk{ get; set; }
[DataMember()]
public string ErrorDesc { get; set; }
[DataMember()]
public T Item { get; set; }
...
}
EchoObj课程:
[DataContract]
public class EchoObj : WaveObj
{
[DataMember]
public string Sound { get; set; }
[DataMember]
public string Volume { get; set; }
[DataMember]
public DateTime TimeAt { get; set; }
[DataMember]
public override string Code
{
get { return "TestSound"; }
}
[DataMember]
public override string Type
{
get { return "Test"; }
}
}
编辑:我忘了派生类WaveObj,它看起来如下:
[DataContract]
public class WaveObj
{
[DataMember]
public virtual string Code { get; set; }
[DataMember]
public virtual string Type { get; set; }
...
}
我认为,WaveObj和EchoObj有些不对劲但我找不到。
有任何想法如何修复序列化错误?
非常感谢。
答案 0 :(得分:0)
请查看'KnownType'属性 http://blogs.msdn.com/b/darrylru/archive/2011/05/04/datacontract-serialization-with-generics-amp-read-only-properties.aspx
答案 1 :(得分:0)
我在书上搜索了解这里的问题是什么,我知道,wcf不理解DateTime属性将其序列化为仅带有DataMember属性的json。该属性应如下所示:
[DataContract]
public class EchoObj : WaveObj
{
[DataMember]
public string Sound { get; set; }
[DataMember]
public string Volume { get; set; }
[DataMember(EmitDefaultValue = false)]
public DateTime TimeAt { get; set; }
[DataMember]
public override string Code
{
get { return "TestSound"; }
}
[DataMember]
public override string Type
{
get { return "Test"; }
}
}
DateTime属性上的属性应为[DataMember(EmitDefaultValue = false)]
以解决该问题。