【问题标题】:Using JsonSerializer and DeflateStream to return compressed stream in WCF使用 JsonSerializer 和 DeflateStream 在 WCF 中返回压缩流
【发布时间】:2017-08-24 03:59:14
【问题描述】:

现在我正在使用 JSON.net JsonSerializer 从我的 WCF 服务以流形式返回数据。代码是这样的:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
public Stream GetJSON()
{
    Dictionary<string, string> resultDict = new Dictionary<string, string>();
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
    return SerializeToJSON(resultDict);
}

public static Stream SerializeToJSON(object value)
{
    MemoryStream stream = new MemoryStream();
    StreamWriter writer = new StreamWriter(stream);
    JsonTextWriter jsonWriter = new JsonTextWriter(writer);
    JsonSerializer ser = new JsonSerializer();

    ser.Formatting = Formatting.None;
    ser.Serialize(jsonWriter, value);
    jsonWriter.Flush();
    stream.Position = 0;
    return stream;
}

我想知道是否可以在某处添加 DeflateStream 并返回压缩数据。

将其直接添加到 SerializeToJSON 方法不起作用,因为我无法在将数据返回给客户端之前处理流或 WCF 关闭它们。

有什么建议吗?

【问题讨论】:

    标签: c# .net wcf stream json.net


    【解决方案1】:

    我找到了一个解决方案并重新编写了我的代码以更好地处理流。 据我了解,无法处理返回的流,因为 WCF 需要它们来处理返回的数据

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
    public Stream GetJSON()
    {
        WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
        WebOperationContext.Current.OutgoingResponse.Headers["Content-Encoding"] = "gzip";
        Dictionary<string, string> resultDict = new Dictionary<string, string>();
        return Compress(SerializeToJSON(resultDict));
    }
    
    public static Stream SerializeToJSON(object value)
    {
        var resultStream = new MemoryStream();
        using (var jsonStream = new MemoryStream())
        using (var writer = new StreamWriter(jsonStream))
        using (var jsonWriter = new JsonTextWriter(writer))
        {
            var jsonSer = new JsonSerializer();
            jsonSer.Formatting = Formatting.None;
            jsonSer.Serialize(jsonWriter, value);
            jsonWriter.Flush();
            resultStream = new MemoryStream(jsonStream.ToArray());
        }
        return resultStream;
    }
    
    public static Stream Compress(Stream plainStream)
    {
        var resultStream = new MemoryStream();
        using (var compressedStream = new MemoryStream())
        using (var compressor = new GZipStream(compressedStream, CompressionMode.Compress))
        {
            plainStream.CopyTo(compressor);
            compressor.Close();
            resultStream = new MemoryStream(compressedStream.ToArray());
        }
        return resultStream;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多