SOAP信封中的WCF和输入参数顺序

SOAP信封中的WCF和输入参数顺序,wcf,soap,request,input-parameters,Wcf,Soap,Request,Input Parameters,我在使用webHttpBinding(soap 1.1)的WCF web服务中获得了一个对象引用,该引用未设置为对象错误的实例。我注意到,如果输入参数按一定顺序排列,则不会引发错误 i、 e testUserID testTaskID testTaskType 测试状态 testAppID 测试消息 但是,如果更改请求模板中输入参数的顺序,就会出现上述错误。i、 e.(注意消息和用户ID参数已切换) 测试消息 testTaskID testTaskType 测试状态 testAppID t

我在使用webHttpBinding(soap 1.1)的WCF web服务中获得了一个对象引用,该引用未设置为对象错误的实例。我注意到,如果输入参数按一定顺序排列,则不会引发错误

i、 e


testUserID
testTaskID
testTaskType
测试状态
testAppID
测试消息
但是,如果更改请求模板中输入参数的顺序,就会出现上述错误。i、 e.(注意消息和用户ID参数已切换)


测试消息
testTaskID
testTaskType
测试状态
testAppID
testUserID

为什么会这样?请求参数是否通过顺序而不是名称映射到.Net方法参数?我是否必须在服务契约上指定一个属性,以使命名参数映射成为可能?

SOAP消息的XML模式指定了顺序。按照元素的XML顺序,WCF正在根据模式验证XML。

您需要在WCF服务接口中使用XmlSerializerFormat

[ServiceContract, XmlSerializerFormat]
public interface IGoodMessageService
{
    ...
}

此链接中解释了问题和解决方案:

是否有任何方法可以使用类似命名参数的内容,以便消费客户端可以按任何顺序指定参数,只要在标记中指定了正确的名称?我不这么认为。SOAP和XSD是为互操作性设计的定义良好的标准。不要认为SOAP是方法和参数,因为您的语言会生成代理。把它看作是消息传递,并且该消息的契约是经过严格验证的。我刚刚发布了相同的问题,只是我在ASMX中补充说,订购并不重要。我认为WCF中会有一个设置,允许您模拟ASMX中的无序功能。是的,请添加一些解释,如果可以的话,我会接受这个作为答案。然而,我等了两年才得到答案:D
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:not="http://schemas.globalfoundries.com/NotificationService">
   <soapenv:Header/>
   <soapenv:Body>
      <not:NotifyWorkflowItemUpdate>
     <not:message>testMessage</not:message>
         <not:taskID>testTaskID</not:taskID>
         <not:taskType>testTaskType</not:taskType>
         <not:status>testStatus</not:status>
         <not:appID>testAppID</not:appID>
         <not:userIDs>testUserID</not:userIDs>
      </not:NotifyWorkflowItemUpdate>
   </soapenv:Body>
</soapenv:Envelope>
[ServiceContract, XmlSerializerFormat]
public interface IGoodMessageService
{
    ...
}