2011-11-30 142 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