C# 更改WCF WebApi HttpContent响应

C# 更改WCF WebApi HttpContent响应,c#,xml,wcf,json,wcf-web-api,C#,Xml,Wcf,Json,Wcf Web Api,使用WCFWebAPI,我将如何在应用程序逻辑运行之后但在返回给用户之前更改响应的内容体。目标是如果suppressstatuscontent为真,我们: 将statuscode字段添加到内容正文中 将响应上的状态代码更改为200 我已经重写了DelegatingChannel,在SendAsnyc中有一些代码如下所示: protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage reques

使用WCFWebAPI,我将如何在应用程序逻辑运行之后但在返回给用户之前更改响应的内容体。目标是如果suppressstatuscontent为真,我们:

  • 将statuscode字段添加到内容正文中
  • 将响应上的状态代码更改为200
我已经重写了DelegatingChannel,在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;
   });
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
返回base.sendaync(请求,取消令牌).ContinueWith(任务=>
{
var response=task.Result;
if(CheckIfRequestHadSuppressStatusCode(请求)==true)
{
字符串newResponse=(response.Content==null)?“”:response.Content.ReadAsString();
newResponse=“”+newResponse+“”+response.StatusCode+“”;
response.StatusCode=HttpStatusCode.OK;
}
返回响应;
});

一个主要问题是,不能同时处理
xml
Json
。我觉得必须有更好的方法来解决这个问题,因为这让人感觉非常棘手。

您可以将内容解析为xml或Json(您可以将该功能封装在它自己的类中)这样,您就可以添加独立于格式的字段(独立于
SendAsync
不需要知道的意义)

假设
Parse
将返回一种您可以修改的内容对象,而无需知道其格式

这不是一个很好的解决方案,但它将黑客行为封装了一点

更新:假设您可以从
HttpResponseMessage
中撤销,并完全控制生成响应,那么您可以拥有专门的子类来处理它:

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);
}

我不确定正确的方法,但我会尝试以下方法:

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;
   });
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
return base.sendaync(请求、取消令牌)
.ContinueWith(任务=>
{
var response=task.Result;
if(CheckIfRequestHadSuppressStatusCode(请求)==true)
{
开关(response.Content.Headers.ContentType.MediaType)
{
案例“应用程序/xml”:
response.Content=newXMLWithStatusContent(response.Content)
打破
案例“application/json”:
response.Content=newjsonwithstatuscontent(response.Content)
打破
}
response.StatusCode=HttpStatusCode.OK;
}
返回响应;
});
}
您可以将添加额外状态代码标记的代码封装在HttpContent的专用版本中(例如XmlWithStatusContent和JsonWithStatusContent)