WCF服务,Json序列化和错误查找

问题描述

| 假设我有简单的WCF服务:
[ServiceContract]
public interface ITestService
{
    [OperationContract]
    [WebInvoke(Method = \"POST\",BodyStyle = WebMessageBodyStyle.Wrapped,ResponseFormat = Webmessageformat.Json)]
    object Operation();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService : ITestService
{
    public object Operation()
    {
          return /*some object*/
    }
}
还有一个aspx页面,它对该服务进行ajax调用并使用返回的对象,这是ajax调用
$.ajax({
    type: \"POST\",url: \"TestService.svc/Operation\",async: false,contentType: \"application/json; charset=utf-8\",dataType: \"json\",processdata: true,success: function (msg) {
     var res = msg.OperationResult;
    },error: function (xhr,msg,thrown) {
     var error = xhr;
    }
});
如果Operation()返回简单的对象,例如字符串或数字,则msg.OperationResult返回此对象,不引发错误,一切正常。 但是,如果我尝试返回具有公共和内部引用类型的公共和内部属性的复杂对象,则在成功回调中传递的msg.OperationResult是不确定的。错误回调未引发。似乎WCF试图序列化复杂的对象,遇到错误并仅返回null而不抛出异常。 问题是-我该如何处理此类错误? WCF内部使用哪个串行器?是DataContractJsonSerializer吗?     

解决方法

是的,使用的是DataContractJsonSerializer。 WCF将仅序列化它所知道的类型。您将返回类型声明为
object
,因此它将只能返回System.Object的实例或WCF始终已知的原始类型(例如数字,字符串,DateTime等)。如果需要返回复杂类型,则需要在合同中将其声明为已知类型,如下所示。 带有已知类型声明的合同。有关更多信息,请参见ServiceKnownType属性的文档。
[ServiceContract]
public interface ITestService {
    [OperationContract]
    [ServiceKnownType(typeof(MyComplexType))]
    [WebInvoke(Method = \"POST\",BodyStyle = WebMessageBodyStyle.Wrapped,ResponseFormat = WebMessageFormat.Json)]
    object Operation();
}