从REST服务控制响应格式

时间:2011-11-30 17:22:34

标签: c# xml rest response

我有一个用C#编写的REST服务,可以读入参数并返回一些值,但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 个答案:

答案 0 :(得分:1)

WCF方法有3种特殊的返回类型,可以让您更好地控制返回给客户端的内容:

System.ServiceModel.Channels.Message
Stream
byte[]

Stream和字节数组只是将Stream或数组中的数据返回给客户端。对于消息对象,您需要使用Message对象中的一个静态CreateMessage重载来创建要返回的实例。使用这些返回类型之一,您将不得不创建自己返回的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)); 
        }
    }      
}