好的,我们说我有这两个课程:
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:
此处返回原始请求的对象:
以下是将类型定义为父类型时返回的对象:
答案 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;
}