2011-08-29 71 views
0

如何使用查詢字符串創建動態響應?WCF動態響應格式

我想根據用戶在郵件正文內部的具體內容動態輸出響應格式。

例如,如果用戶輸入「json」,「xml」,「soap」,它將返回相應的格式。提前致謝。

public interface IReg 
{ 
    [OperationContract] 
    [WebInvoke] 
    MemberBasic Login(string uniqueID, string password, string returnFormat); 
} 

[DataContract(Namespace = "", IsReference=false)] 
[Serializable()] 
public class MemberBasic 
{ 

    #region Properties 
    [DataMember] 
    public DateTime LastModified 
    { 
     get; 
     set; 
    } 
} 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public sealed class RWS : IReg 
{ 


    public MemberBasic Login(string uniqueID, string password, string returnFormat) 
    { 
     MemberBasic result = new MemberBasic(); 
     setReturnFormat(returnFormat); 
     return result; 
    } 
} 
private static void Init(string returnFormat) 
    { 
     var response = WebOperationContext.Current.OutgoingResponse; 
     response.Headers.Add("cache-Control", "no-cache"); 
     response.Headers.Add("Last-Modified", string.Format("{0:r}", DateTime.Today)); 

     switch (returnFormat) 
     { 
      case "xml": 
       { 
        WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Xml; 
        WebOperationContext.Current.OutgoingRequest.Headers.Add(System.Net.HttpRequestHeader.ContentType, "application/json"); 
       } break; 
      case "json": 
       { 
        WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json; 
       } break; 
      default: 
       { 
        throw new ArgumentException("Return Format unrecognized; cannot complete request.", 
         "returnFormat"); 
       } 
     } 
    }  
+0

您能向我們解釋您的示例代碼嗎?它工作嗎?如果不是,它是如何失敗的? –

+0

它失敗!我想知道用戶如何傳遞他們想要的返回類型,並且只顯示它。 – James

+0

它只會返回肥皂請求。 – James

回答

3

最簡單的做法是使用不同的綁定創建不同的端點。你可以有一個POX,SOAP和JSON。他們可以共享合同和實現,但WCF /配置負責管理請求/響應格式。

將SOAP指定爲響應格式沒有多大意義,因爲在WCF中,這意味着請求也必須是SOAP請求。

+0

的確如此。我已經開始使用查詢字符串來支持多個請求。但是,我想看看是否有另一種方式。它可以用多個端點完成。我希望用戶指定返回格式。 – James

+0

那麼你需要支持一個場景,比如,客戶端以JSON格式發送請求,但是需要SOAP響應?我很高興能通過比我更聰明的大腦糾正,但我不相信WCF支持這種情況。你運行的是哪種客戶端,可以處理請求和響應的不同消息格式? –

+0

我認爲它可能只是沒有人試過。我希望用戶控制他們的響應格式。爲什麼它們應該受到限制?如果它們有限,那意味着我的設計有限制。我會在這個項目上多花一天時間。感謝您的答覆。 – James

2

您不能在同一個端點中使用SOAP和JSON(或POX - 「普通舊式XML」)響應。 SOAP是一個協議,它規定了請求和響應如何格式化 - 根據SOAP信封版本,SOAP尋址標頭(或不存在它們)等。如果端點「說話」SOAP,則它不能說「肥皂」。

要在JSON和XML(即POX)之間進行切換,您可以在操作中指定您希望在單個端點返回時使用的格式。端點需要無SOAP(即其綁定必須具有MessageVersion.None,例如WebHttpBinding),並且已應用Web行爲(通常是配置中定義的WebHttpBehavior<webHttp/>)。這樣的端點通常被稱爲WCF WebHttp端點或(相當有誤稱的)REST端點。

您的示例是爲Web端點執行此操作的一種方法,但如果將響應格式設置爲XML,則可能會將內容類型設置爲application/json,這可能會破壞客戶端。

+0

謝謝,所以有沒有辦法讓用戶定義響應格式? – James

+1

是的,他們可以。如果在POX和JSON之間,可以通過像你這樣的參數完成。但是如果它在POX和SOAP之間,那麼不是通過參數,而是通過端點地址(POX的一個端點,一個用於SOAP)。 – carlosfigueira