wcf XML格式的REST响应

时间:2011-06-12 18:13:59

标签: wcf rest

以下是我的运营合同

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Xml,
UriTemplate = "Add?num1={a}&num2={b}")]
Addition AddNumbers(string a, string b);

和以下是我的OperationContract实现,并且我返回了一个Addition Class对象

public Addition AddNumbers(string a, string b)
{
Addition objadd = new Addition();
objadd.num1 = a;
objadd.num2 = b;
objadd.num3 = (Convert.ToInt32(a )+ Convert.ToInt32(b)).ToString();
return objadd;
}

以下是我的DataContract

[DataContract(Name="Add")]
public class Addition
{
    private string _num1;
    private string _num2;
    private string _num3;
    [DataMember(Name="FirstNumber",Order=1)]
    public string num1
    {
        set { _num1 = value; }
        get { return _num1; }
    }
    [DataMember(Name="SecondNumber",Order=2)]
    public string num2
    {
        set { _num2 = value; }
        get { return _num2; }
    }
    [DataMember(Name = "Result",Order=3)]
    public string num3
    {
        set { _num3 = value; }
        get { return _num3; }
    }
}

即时测试我的服务如下 http://localhost/Service1.svc/xml/Add?num1=5&num2=4

当我浏览上面的URL时,我得到以下输出

 <Add 
xmlns="http://schemas.datacontract.org/2004/07/MySampleService"  
xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<FirstNumber>5</FirstNumber> 
<SecondNumber>4</SecondNumber> 
<Result>9</Result> 
 </Add>

但我的要求是这样的,我的输出应该如下所示

<Add FirstNumber="5" SecondNumbe="4" Result="9">

</Add>

无论如何,我可以通过Datamembers实现这一目标

2 个答案:

答案 0 :(得分:1)

其他人可以详细说明这一点,但我相信这是你得到的输出,因为WCF默认使用DataContractSerializer,它不支持序列化到属性。如果要支持属性,则必须使用XmlSerializer。

您可以在服务级别或操作级别指定序列化程序。

答案 1 :(得分:1)

是的,WCF默认情况下确实使用DataContractSerializer,并且出于性能原因它不支持Xml属性。 DataContractSerializer的性能优于XmlSerializer(约10%)。

您可以在ServiceContract / OperationContract上应用[XmlSerializerFormatAttribute]时使用DataContractSerializer。然后,您可以按如下方式定义DataContract,

[DataContract(Name="Add")]
public class Addition 
{     
    private string _num1;     
    private string _num2;     
    private string _num3;     

    [DataMember(Name="FirstNumber",Order=1), XmlAttribute]     
    public string num1     
    {         
        set { _num1 = value; }         
        get { return _num1; }     
    }     

    [DataMember(Name="SecondNumber",Order=2), XmlAttribute]     
    public string num2     
    {         set { _num2 = value; }         
          get { return _num2; }     
    }     

    [DataMember(Name = "Result",Order=3), XmlAttribute]     
    public string num3     
    {         
        set { _num3 = value; }         
        get { return _num3; }     
    } 
} 

请注意,通过上述操作,您将失去DataContractSerializer的性能优势。

HTH, 阿米特巴蒂亚