WCF消息合同现实世界的例子

时间:2015-06-06 15:14:17

标签: wcf

我在互联网上搜索过多个资源,但我遇到的只有“Hello World'和'计算器'类似于在WCF中解释消息合同的示例。我想知道Message Contract在实际企业应用程序中的实际用法,以及它应该优先于Data Contract。任何有关这方面的帮助都将受到高度赞赏。

1 个答案:

答案 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>