2011-06-11 98 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); 
}