Управление форматом ответа от службы REST - PullRequest
0 голосов
/ 30 ноября 2011

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

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

<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, который я могу отформатировать самостоятельно.

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

1 Ответ

1 голос
/ 01 декабря 2011

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

System.ServiceModel.Channels.Message
Stream
byte[]

Поток и байтовый массив просто собираются вернуть данные в потоке или массиве клиенту. Для объекта сообщения вам нужно будет использовать одну из статических перегрузок 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)); 
        }
    }      
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...