以下是我的运营合同
[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实现这一目标
答案 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, 阿米特巴蒂亚