使用ws-address的WCF:创建裸参数

时间:2012-06-26 18:11:26

标签: wcf soap ws-addressing

我正在尝试创建一个WCF SOAP服务,它有一个服务方法接受正文中的裸参数,但我不能让它发生。目前,正在正文下创建方法名称元素。我正在尝试使用ws-addressing,以便方法名称是标题的一部分,参数是正文的直接子项。

这是我的服务实施:

[SoapDocumentService(Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Bare)]
public class Service1 : IService1
{        
    [SoapDocumentMethod(Use=SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Bare)]
    public void DoWork([XmlElement(Namespace = "http://www.contoso.com",
                IsNullable = true)] MyClass wrapper)
    {
    }
}

[XmlRoot(Namespace = "http://www.contoso.com")]
public class MyClass
{
    public int Value { get; set; }
    public string MyProperty { get; set; }
}

[ServiceContract]
public interface IService1
{
    [OperationContract]
    void DoWork(MyClass wrapper);
}

以上实现在下面生成soap客户端。但是我试图将包装元素作为正文中的直接子元素(尝试删除DoWork)。根据我的阅读,修改svc方法以使用裸参数应该删除服务方法名称(DoWork)并使用ws-addressing。

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" xmlns:web="http://schemas.datacontract.org/2004/07/WebApplication2">
   <soap:Header/>
   <soap:Body>
      <tem:DoWork> <!-- I want to remove this svc method name element  -- >
         <tem:wrapper>  <!-- I want this to be under the body -->
            <!--Optional:-->
            <web:MyProperty>?</web:MyProperty>
            <!--Optional:-->
            <web:Value>?</web:Value>
         </tem:wrapper>
      </tem:DoWork>
   </soap:Body>
</soap:Envelope>

我按照msdn的指南来装饰服务方法。 MSDN Link

2 个答案:

答案 0 :(得分:0)

我认为你应该放弃包装。在.net 2中这可行,wcf应该类似:

[WebMethod]
[SoapDocumentMethod(ParameterStyle=SoapParameterStyle.Bare)]
public String EchoString(String s, String s1) 
{
    return s;
}

答案 1 :(得分:0)

我必须为MyClass创建消息合同包装器并指定消息体。

[MessageContract]
    public class MyWrapper
    {
        [MessageBodyMember]
        public int Value { get; set; }
        [MessageBodyMember]
        public string MyProperty { get; set; }
    }