WCF Soap响应是包装属性

时间:2016-09-25 05:32:00

标签: c# wcf soap

此WCF响应似乎不止一次地包装属性WhoAmIResult

响应:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <WhoAmIResponse xmlns="http://tempuri.org/">
         <WhoAmIResult xmlns:a="http://schemas.datacontract.org/2004/07/Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:WhoAmIResult>your name here</a:WhoAmIResult>
         </WhoAmIResult>
      </WhoAmIResponse>
   </s:Body>
</s:Envelope>

期望:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <WhoAmIResponse xmlns="http://tempuri.org/">
         <a:WhoAmIResult>your name here</a:WhoAmIResult>
      </WhoAmIResponse>
   </s:Body>
</s:Envelope>

这里有代码:

[ServiceContract]
public interface IService
{
    [OperationContract]
    WhoAmIResponse WhoAmI(string s);
}

[DataContract]
public class WhoAmIResponse
{
    [DataMember]
    public string WhoAmIResult { get; set; }
}

public class Service : IService
{
    public WhoAmIResponse WhoAmI(string s)
    {
        return new WhoAmIResponse
        {
            WhoAmIResult = s
        };
    }
}

我无法弄清楚我需要做些什么来获得这个响应,而不会超过包装器。答案中我不能两次WhoAmIResult

2 个答案:

答案 0 :(得分:1)

您可以尝试将设置名称空间设置为空

[DataContract(Namespace = "")]
public class WhoAmIResponse
{
    [DataMember]
    public string WhoAmIResult { get; set; }
}

答案 1 :(得分:0)

当我拿出@STORM告诉我的命名空间时,我得到了这个回复:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">    
  <s:Body>
    <WhoAmIResponse xmlns="http://tempuri.org/">
       <WhoAmIResult xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
          <WhoAmIResult xmlns="">your name result</WhoAmIResult>
       </WhoAmIResult>
    </WhoAmIResponse>    
  </s:Body> 
</s:Envelope>

命名空间不在那里,但仍然有包装器。

经过一些实验后,我注意到WhoAmIResult可能是字符串响应的名称而不是对象。所以我删除了WhoAmIResponse对象并放了一个简单的字符串响应。代码最终如下:

public class MyService : IMyService
{
    public string WhoAmI(string s)
    {
        return s;
    }
}

现在我收到了预期的回复:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <WhoAmIResponse xmlns="http://tempuri.org/">
         <WhoAmIResult>your name result</WhoAmIResult>
      </WhoAmIResponse>
   </s:Body>
</s:Envelope>

问题在于我不需要声明另一个对象来给出答案。似乎有一个响应XML的约定,如[MethodName]Response[MethodName]Result

谢谢@STORM,我很惭愧。