【问题标题】:ApiController is returning a double-escaped string for a CSV stringApiController 正在为 CSV 字符串返回双转义字符串
【发布时间】:2019-07-01 15:58:14
【问题描述】:

我正致力于在异步 MQ 框架中创建 CSV 报告。

我设置了一个可以准确返回 CSV 结果的端点,即:

Column 1, Column2, Column 3\r\nValue 1, Value 2, Value 3

但是,一旦此消息被序列化并作为响应发送,每个结果都会被双重转义,即

\"Column 1, Column 2, Column 3\\r\\nValue 1, Value 2, Value 3\"

... 这使得结果解析为文字引号和换行符,这显然不是 CSV 的有效格式。

在返回 ApiController.Ok(value) 之前,我已经在返回值上尝试了 string.Trim('"')Regex.Unescape(),但是 OK 方法本身中的序列化正在转义字符。我不能在检索端对它们进行转义,因为框架也处理 HTML 和 PDF,并且必须不知道返回字符串的格式——另外,这个端点将在更多地方使用,并且应该返回一个未转义的字符串.

关于如何防止这种情况的任何想法?

【问题讨论】:

  • 尝试以base64格式传递。

标签: c# .net asp.net-web-api .net-core


【解决方案1】:

您可以在控制器方法上放置一个属性:[Produces("text/plain")]

【讨论】:

    【解决方案2】:

    所以,这是因为 API 控制器试图将字符串序列化,就像它是 JSON 对象一样。

    一种解决方法是将其作为流返回,在 HttpResponseMessage 中使用 StreamContent:

            string content = GetCsvStuffFromSomewhere();
    
            var stream = new MemoryStream(Encoding.UTF8.GetBytes(content));
    
            var response = new HttpResponseMessage
            {
                StatusCode = System.Net.HttpStatusCode.OK,
                Content = new StreamContent(stream)
            };
    
            response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
    
            return response;
    

    【讨论】:

      猜你喜欢
      • 2014-06-11
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2012-12-12
      • 1970-01-01
      • 2012-03-14
      相关资源
      最近更新 更多