我的理解是WCF将服务契约与传输协议分离,以允许不同系统之间的通信。我的问题是,WCF如何确定/帮助更高级别的通信协议(应用程序级别而不是传输级别)?
因此,在TCP WCF场景中,一端不是WCF,WCF是否只假设SOAP?或者,我们可以覆盖并指定带有[Attribute]
的自定义XSD吗?
代理类是否仍适用于不同的系统?那么另一端是否仍然知道合同中的类型?
答案 0 :(得分:1)
是的,开箱即用WCF假设你正在使用SOAP。
您可以使用WebGet属性将方法调用的结果从XML修改为JSON,如下所示:
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public string MyMethod() { ... }
您还可以使用ODCF,使用WCF数据服务库和项目类型:http://msdn.microsoft.com/en-us/library/cc668792.aspx
或者如果您不希望这样,您可以使用REST Starter Kit for WCF,它实现REST而不是SOAP / WSDL:http://www.asp.net/downloads/starter-kits/wcf-rest
答案 1 :(得分:1)
听起来像应用程序级协议,你的意思是数据的序列化/编码方式。您可以创建自己的编码器。但通常编码被认为是传输协议的一部分。
合同中的类型意识是通过WSDL完成的。如果要将新协议(传输/编码)描述为WSDL的一部分,则必须为WSDL创建一些自定义扩展,并为WCF创建自定义导出/导入器扩展。同样在WCF的情况下,服务和客户端都需要使用新的传输/编码访问程序集。
如果您使用标准DataContractSerializer
(使用XmlSerializer
)交换默认XmlSerializerFormatAttribute
,您可以使用自定义XSD,您可以完全控制XML序列化,并且可以强制您的类序列化为.NET Framework中提供的标准XML序列化工具所需的任何XSD(属性,IXmlSerializable
)
单独的区域是REST,但WSDL不描述休息(至少不在WCF中,因为它不支持WSDL 2.0),并且不为REST服务生成代理。
顺便说一下。默认WCF TCP只是WCF到WCF - 它有自己的消息格式和编码。