我有一个WCF项目,包括:
WCF Server
WCF Client
WCF Class Library
类库由服务器和客户端共享,并包含Person对象。因此客户端可以这样做:
public Person XMLToPerson()
{
ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client();
Person p = s1.GetPerson();
return p;
}
如果您的Java客户端引用了Web服务,会发生什么?当然这是反对互操作性的吗?
Q1)如果您拥有Java客户端会发生什么?它如何接受Person对象?
Q2)为什么Web服务返回自定义类型而不是JSON / XML?如果它返回JSON / XML,那么客户端可以以任何方式去除它吗?
旧版Web服务(.asmx)也是如此。幸运的是,我过去开发的所有Web服务仅供.NET客户端使用,因此我不需要考虑这一点。但是,这个问题一直都在我的脑海里。
答案 0 :(得分:0)
如果您正在使用BasicHttpBinding,那么服务器和客户端之间发送的是SOAP XML,而不是对象。你在.net中看到自定义类型,因为.net为你提供了一个很好的框架,可以抽象出所有的XML。这在WCF中很重要,因为WCF还可以通过更改或添加配置(而不是通过重写代码)来使用其他格式和协议。 ASMX也使用SOAP,但它没有WCF的灵活性。
您可能会遇到不同平台上不同SOAP实现的不兼容问题,但我没有经常看到这种问题。
答案 1 :(得分:0)
WCF以SOAP格式交换信息,因此它可与其他语言高度互操作。 Java客户端可以是Apache CXF来生成包装类,例如,
http://adventuresinsoftware.com/blog/?p=481
您还可以将WCF转换为公开REST API,这在目前非常普遍。
专门回答您的问题。当您使用VS生成服务引用时,SOAP到对象的转换将由生成的包装类自动处理(Apache CXF对Java客户端执行相同的操作)。你真的应该看看生成的类知道如何。那么你也可能知道为什么没有人真正想要触摸原始SOAP数据,因为XML太冗长而且你不想浪费时间在你自己身上。