2011-06-11 100 views
2

使用WCF Web API,我將如何在應用程序邏輯運行之後但在將其返回給用戶之前更改響應的內容主體。我們的目標是,如果suppressstatuscontent是真實的我們:C#WCF WebAPI修改響應的HttpContent

  • 添加的StatusCode字段內容主體
  • 更改我已經覆蓋的DelegatingChannel關於應對200

中的StatusCode並在SendAsnyc有一些代碼,看起來像這樣:

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
        { 
        return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(task => 
        { 
         var response = task.Result; 

         if (CheckIfRequestHadSuppressStatusCode(request) == true) 
         { 
          string newResponse = (response.Content == null) ? "" : response.Content.ReadAsString(); 
          newResponse = "<body>" +newResponse + "</body><statuscode>" + response.StatusCode + "</statuscode>"; 
          response.StatusCode = HttpStatusCode.OK;         
         } 

         return response; 
        }); 

一個主要問題是,這並不處理XML和JSON。我覺得必須有一個更好的方法來解決這個問題,因爲這感覺很不好。

回答

3

我不知道正確的方法,但我會嘗試這樣的事情,

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
     { 
     return base.SendAsync(request, cancellationToken) 
      .ContinueWith<HttpResponseMessage>(task => 
       { 
       var response = task.Result; 

       if (CheckIfRequestHadSuppressStatusCode(request) == true) 
        { 
        switch(response.Content.Headers.ContentType.MediaType) { 
        case "application/xml": 
         response.Content = new XmlWithStatusContent(response.Content) 
         break; 
        case "application/json": 
         response.Content = new JsonWithStatusContent(response.Content) 
         break; 
        } 

        response.StatusCode = HttpStatusCode.OK;         
       } 

     return response; }); 

您可以封裝,增加了額外的狀態代碼標記在專門的代碼HttpContent的版本(例如XmlWithStatusContent和JsonWithStatusContent)。

+0

+1內容類型不錯的想法,錯過了那一個 – ChrisWue 2011-06-11 02:47:44

0

您可以將內容解析爲XML或JSON(您可以將該功能封裝在其自己的類中),然後您可以添加獨立於該格式的字段(獨立的意思是SendAsync doesn'需要知道)。

var newResponse = ContentDecoder.Parse(response.Content).AddField("statuscode", response.StatusCode).ToString(); 

假設Parse將返回來樣內容物可以修改,而不必知道格式是什麼。

這不是一個非常好的解決方案,但它封閉了一點點hackiness。

更新:假設你可以從HttpResponseMessage dereive並在生成響應的完全控制,那麼你可以有專門的子類和它打交道:

interface IHttpResponseContent 
{ 
    void AddField(string name, string value); 
} 

class XmlHttpResponseMessage : HttpResponseMessage, IHttpResponseContent 
{ 
} 

當生成創建XML/JsonHttpResponseMessage對象響應代替。然後,你可以這樣做:

var newResponse = response as IHttpResponseContent; 
if (newResponse != null) 
{ 
    newResponse.AddField("statuscode", response.StatusCode); 
}