当使用父类类型创建此对象时,如何使用$ .getJSON返回对象

时间:2014-09-11 18:41:16

标签: c# javascript jquery wcf

好的,我们说我有这两个课程:

namespace CreeContact.CSBDObject.Object
{
    public class BaseObject
    {
    }
}

namespace CreeContact.CSBDObject.Object
{
    public class TestObject : BaseObject
    {
        public string name;
        public TestObject()
        {
            name = "Default";
        }
    }
}

我有一个wcf服务,它创建一个返回它的对象:

namespace CreeContact.WebServices
{

    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Object
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public TestObject createobject()
        {

            TestObject objecttocreate = new TestObject();
            return objecttocreate;
        }
    }
}

以下是我用jquery调用它的方法:

$.getJSON("WebServices/Object.svc/createobject", function (data) {
    alert(data.d.name);
});

当我执行这样的代码时:所有按预期工作 - 提示显示"默认"。

但是,让我们说我修改了这部分:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public TestObject createobject()
{

      TestObject objecttocreate = new TestObject();
      return objecttocreate;
}

对此:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public BaseObject createobject()
{

      BaseObject objecttocreate =(BaseObject) new TestObject();
      return objecttocreate;
}

我只是将创建的对象的类型更改为其父级的类型。

现在我在javascript中遇到此错误:net :: ERR_EMPTY_RESPONSE。

我进行了验证,在wcf服务中创建的对象没有错误。当Jquery得到结果时出现错误。

Additionnal infos:

此处返回原始请求的对象:

enter image description here

以下是将类型定义为父类型时返回的对象:

enter image description here

1 个答案:

答案 0 :(得分:3)

因为如果您向下转换为基础对象,则没有定义name成员,因此您的Web服务不会向请求者发送任何内容

class BaseObject
{
    //This class contains no members
}

class ExtendedObject : BaseObject
{
    public string Name;
}

void Example()
{
    ExtendedObject extended = new ExtendedObject {Name = "Default"};
    BaseObject downcast = (BaseObject)extended;
    //This won't compile - Name is undefined because it's not defined in your base
    downcast.Name;
}