【问题标题】:Change WCF WebApi HttpContent response更改 WCF Web Api HttpContext 响应
【发布时间】:2011-09-12 21:30:59
【问题描述】:

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

  • 向内容正文添加状态码字段
  • 将响应中的状态码更改为 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。我觉得必须有更好的方法来解决这个问题,因为这感觉很hacky。

【问题讨论】:

    标签: c# xml wcf json wcf-web-api


    【解决方案1】:

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

    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)中。

    【讨论】:

      【解决方案2】:

      您可以将内容解析为 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 2016-02-17
        • 2023-03-27
        • 2020-02-05
        • 2011-09-13
        • 1970-01-01
        相关资源
        最近更新 更多