【发布时间】:2011-03-04 06:18:58
【问题描述】:
我在下面列出了两个课程
public Class Vehicle
{
int wheels { get ; set}
}
public Class Car:Vehicle
{
int topspeed { get; set ;}
}
//This is the container class
public Class Message
{
string ConatinerName { get; set;}
Vehicle Container;
}
我已经定义了一份服务合同,如下所示。此 Web 服务启用了两个端点。一个是SOAP,一个是Json
//this function gets a message object, looks into the container
public Message GetMessage(Message Input)
{
Car mycar = (Car)Message.Container;
mycar.topspeed = 200;
Message retMessage = new Message();
retMessage.ContainerName ="Adjusted Car Speed";
retMessage.Container = mycar;
return retMessage;
}
当我运行 WCF Web 服务时,Visual Studio 原生测试客户端能够使用 Message 对象调用该服务,并提供在 Message 容器中传递汽车或车辆对象的选项。 VS 客户端根据传入的原始数据使用肥皂端点。 测试服务的json端点
我正在使用一个用 Python 编写的简单客户端,它使用 json 数据格式调用上述 web 服务 GetMessage() 方法。我传入了一个Car 对象,但是当服务实际获取时
webservice方法获取数据,对象内部的容器只包含Vehicle对象。
我检查了 webmethod 接收的请求上下文,它显示接收到正确的 json 字符串(因为它被发送),但是 .net 以某种方式剥离了 Car 类属性并且只传递了 Vehicle 属性。因此,GetMessage() 内部对汽车的投射会引发异常,说明您正在尝试将车辆投射到无效投射的汽车上。
现在我知道Message 中的Container 是Vehicle 类型,但是对于SOAP 端点,我能够传入汽车对象和车辆对象,但对于json 端点只有一个Vehicle对象可以通过Message容器传入。
我的问题是如何让 .NET 运行时识别出我正在尝试传入 Car 而不是 Vehicle?
我的json客户端代码贴在下面
import urllib2, urllib, json
def get_json(url):
f = urllib2.urlopen(url)
resp = f.read()
f.close()
return json.loads(resp)
def post(url, data):
headers = {'Content-Type': 'application/json'}
request = urllib2.Request(url, data, headers)
f = urllib2.urlopen(request)
response = f.read()
f.close()
return response
geturl = 'http://localhost:24573/Service1.svc/json/GetMessage'
sendurl = 'http://localhost:24573/Service1.svc/json/SendMessage'
msg = get_json(geturl)
print 'Got', msg
print 'Sending...'
retval = post(sendurl, json.dumps(msg))
print 'POST RESPONSE', retval
【问题讨论】: