我在互联网上搜索过多个资源,但我遇到的只有“Hello World'和'计算器'类似于在WCF中解释消息合同的示例。我想知道Message Contract在实际企业应用程序中的实际用法,以及它应该优先于Data Contract。任何有关这方面的帮助都将受到高度赞赏。
答案 0 :(得分:0)
例如,当Java客户端具有不更改的WSDL文件时(技术原因),真实的场景就是如此。所以Java客户端有一个固定的WSDL文件。然后,Web服务(.net)必须为此方法提供确切的名称,命名空间,操作和消息字符串。
示例Java客户端:
<operation name="remove">
<input wsam:Action="remove" message="tns:remove"/>
<output wsam:Action="removeResponse" message="tns:removeResponse"/>
</operation>
默认是在自动生成的Web服务中,如下所示:
<wsdl:operation name="remove">
<wsdl:input message="tns:IService1_remove_InputMessage" wsaw:Action="http://tempuri.org/IService1/remove"/>
<wsdl:output message="tns:IService1_remove_OutputMessage" wsaw:Action="http://tempuri.org/IService1/removeResponse"
</wsdl:operation>
然后服务器和客户端出现不匹配错误,因为客户端无法找到该方法。要解决此问题,您必须更改操作,replyAction和消息字符串。您必须改变的第一个和第二个:
<OperationContractAttribute(Action:="remove", name:="remove" ReplyAction:="removeResponse")> _
Function remove(key As string) As Boolean
新的WSDL文件(服务器):
<wsdl:operation name="remove">
<wsdl:input message="tns:IService1_remove_InputMessage" wsaw:Action="remove"/>
<wsdl:output message="tns:IService1_remove_OutputMessage" wsaw:Action="removeResponse"
</wsdl:operation>
现在您仍然会遇到相同的不匹配错误,因为消息字符串不相同。要解决这个问题,您需要消息合同。这使您可以操作WSDL文件/ SOAP消息。 为此,方法的语法在IService类中更改。
<OperationContractAttribute(Action:="remove", name:="remove" ReplyAction:="removeResponse")> _
Function remove(key As remove) As removeResponse
和消息合同确定'类型':
<MessageContract()> _
Public Class removeResponse
Private return1 As Boolean()
<DataMember(Name:="return")> _
Public Property returnP() As Boolean ()
Get
Return Me.return1
End Get
Set(ByVal value As Boolean ())
Me.return1 = value
End Set
End Property
End Class
<MessageContract()> _
Public Class remove
Private key1 As String()
<DataMember(Name:="key")> _
Public Property keyP() As String ()
Get
Return Me.key1
End Get
Set(ByVal value As String ())
Me.key1 = value
End Set
End Property
End Class
现在客户端和服务器之间的通信正常。
WSDL(服务器):
<wsdl:operation name="remove">
<wsdl:input message="remove" wsaw:Action="remove"/>
<wsdl:output message="removeResponse" wsaw:Action="removeResponse"
</wsdl:operation>