更改WCF WebApi的HttpContent响应

3
使用WCF Web API,我应该如何在应用程序逻辑运行后但在返回给用户之前更改响应的内容主体。目标是如果suppressstatuscontent为true,则我们会:
  • 向内容主体添加状态码字段
  • 更改响应的状态码为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;
   });

一个主要问题是这种方法无法同时处理xmlJson。我觉得一定有更好的方法来解决这个问题,因为这种感觉非常笨拙。
2个回答

4

我不确定正确的方法,但我会尝试类似这样的做法:

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

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

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

假设Parse会返回某种内容对象,您可以在不必知道格式的情况下进行修改。 这不是一个很好的解决方案,但它可以稍微封装一下hackiness。 更新:假设您可以从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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接