假设我有简单的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()返回像string或number这样的简单对象,则msg.OperationResult返回此对象,不会抛出任何错误,一切正常。 但是,如果我尝试返回具有公共和内部引用类型的公共和内部属性的复杂对象,则成功回调传递的msg.OperationResult未定义。不引发错误回调。看起来WCF正在尝试序列化复杂的对象,面对错误并且只返回null而不是抛出异常。 问题是 - 我如何处理这类错误? WCF内部使用哪个序列化程序?是DataContractJsonSerializer吗?
答案 0 :(得分:2)
object
,因此它只能返回System.Object的实例或WCF始终知道的基本类型(例如数字,字符串,DateTime等)。如果需要返回复杂类型,则需要在合同中将其声明为已知类型,如下所示。具有已知类型声明的合同。有关详细信息,请参阅ServiceKnownType attribute的文档。
[ServiceContract]
public interface ITestService {
[OperationContract]
[ServiceKnownType(typeof(MyComplexType))]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
object Operation();
}