wcf REST-ответ в формате XML - PullRequest
1 голос
/ 12 июня 2011

Ниже указан мой Операционный контракт

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

, а ниже - моя реализация OperationContract, и я возвращаю объект класса дополнения

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 ]

1 голос
/ 12 июня 2011

Да, WCF действительно использует DataContractSerializer по умолчанию и не поддерживает атрибуты Xml по соображениям производительности.DataContractSerializer лучше работает, чем XmlSerializer (около 10%).

Вы можете использовать DataContractSerializer с [XmlSerializerFormatAttribute], примененным к ServiceContract / OperationContract.И затем вы можете определить свой 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.

1 голос
/ 12 июня 2011

Другие могут уточнить это подробнее, но я считаю, что это вывод, который вы получаете, потому что WCF по умолчанию использует DataContractSerializer и не поддерживает сериализацию для атрибутов.Если вы хотите поддерживать атрибуты, вы должны использовать XmlSerializer.

Вы можете указать сериализатор на уровне обслуживания или уровне операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...