2011-11-30 107 views
0

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

有从WCF方法3个特殊的返回类型,让你在什么返回给客户更多的控制:

System.ServiceModel.Channels.Message 
Stream 
byte[] 

流和字节数组只是简单地将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)); 
     } 
    }  
} 
+0

从网上看,似乎暗示SOAP将被返回而不是普通的旧XML。这是正确的还是我走错了路线? – RobP

+0

您使用的是什么绑定,您的完整服务合约是什么样的?既然你说过这是一个Rest服务,我认为你正在使用WebGet或WebInvoke方法。 – user957902

+0

添加了一个例子,希望能够让答案更清晰 – user957902