2011-11-30 2 views
0

У меня есть служба REST, написанная на C#, которая может считывать параметры и возвращает некоторые значения, но XML не имеет в ней достаточного количества уровней.Управление форматом ответа из службы REST

На данный момент он возвращается:

<topNode> 
    <item1>1</item1> 
    <item2>2</item2> 
    <item3>3</item3> 
</topNode> 

Но что мне действительно нужно:

<topNode> 
    <secondNode> 
     <item1>1</item1> 
     <item2>2</item2> 
     <item3>3</item3> 
    </secondNode> 
</topNode> 

Я думаю, что мне нужно сделать, это изменить контракт данных ответа, но я не знаю как. В настоящее время написано так:

[DataContract(Namespace = "http://example.com/myNamespace")] 
public class dataResponse 
{   
    [DataMember] 
    public string item1 { get; set; } 

    [DataMember] 
    public string item2 { get; set; } 

    [DataMember] 
    public string item3 { get; set; } 
} 

Как мне также нужно возвращать XML с разными названиями элементов, если возникает ошибка, я бы в идеале хотел бы вернуть документ XML, который я могу форматировать себя.

Любая помощь/указатели будут оценены

+0

Ждать - в чем разница между тем, что он теперь возвращает и что вам нужно? Мне что-то не хватает ... –

+0

Я забыл добавить второй уровень для начала. Теперь должно выглядеть по-другому. – RobP

ответ

1

Есть 3 специальных типов возврата из метода WCF, которые дают вам больше контроля над тем, что возвращается к клиенту:

System.ServiceModel.Channels.Message 
Stream 
byte[] 

потока и массив байтов просто собираются вернуть данные в Stream или массив клиенту. Для объекта сообщения вам нужно будет использовать одну из статических перегрузок CreateMessage в объекте Message, чтобы создать экземпляр для его возврата. Используя один из этих типов возврата, вам нужно будет создать XML, который возвращается сам, но я думаю, что это то, что вы ищете здесь. Например, вы можете сделать что-то вроде этого:

[ServiceContract] 
public interface: IMyContract 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", UriTemplate = "getXml")] 
    Stream ReturnAnyXml(); 
} 

public class MyService : IMyContract 
{ 
    public Stream ReturnAnyXml() 
    { 
     WebOperationContext CurrentWebContext = WebOperationContext.Current; 
     if (CurrentWebContext != null) 
     { 
      CurrentWebContext.OutgoingResponse.ContentType = "text/xml";  
      String AnyXml = "<tag></tag>"; 
      return new MemoryStream(Encoding.UTF8.GetBytes(AnyXml)); 
     } 
    }  
} 
+0

Глядя на сеть, которая, кажется, подразумевает, что SOAP будет возвращен, а не простой старый XML. Это правильно или я пошел по неверному пути? – RobP

+0

Какая привязка вы используете и как выглядит ваш полный контракт на обслуживание? Поскольку вы сказали, что это служба Rest, я предполагаю, что вы используете методы WebGet или WebInvoke. – user957902

+0

Добавлен пример, который наверняка сделает ответ более ясным – user957902

Смежные вопросы