代码之家  ›  专栏  ›  技术社区  ›  AwkwardCoder

为什么写入响应流时内容被损坏

  •  0
  • AwkwardCoder  · 技术社区  · 15 年前

    我正试图写出响应流——但它失败了,不知何故它在破坏数据……

    我希望能够将存储在其他地方的流写入httpwebresponse,这样我就不能对此使用“writefile”,另外我还希望对几种mime类型执行此操作,但对所有类型都失败-mp3、pdf等…

     public void ProcessRequest(HttpContext context)
        {
            var httpResponse = context.Response;
            httpResponse.Clear();
            httpResponse.BufferOutput = true;
            httpResponse.StatusCode = 200;
    
            using (var reader = new FileStream(Path.Combine(context.Request.PhysicalApplicationPath, "Data\\test.pdf"), FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                var buffer = new byte[reader.Length];
                reader.Read(buffer, 0, buffer.Length);
    
                httpResponse.ContentType = "application/pdf";
                httpResponse.Write(Encoding.Default.GetChars(buffer, 0, buffer.Length), 0, buffer.Length);
                httpResponse.End();
            }
        }
    

    提前干杯

    1 回复  |  直到 15 年前
        1
  •  4
  •   Joel Coehoorn    15 年前

    因为你在写字符,而不是字节。字符绝对不是字节;它必须被编码,这就是您的“损坏”出现的地方。改为这样做:

    using (var reader = new FileStream(Path.Combine(context.Request.PhysicalApplicationPath, "Data\\test.pdf"), FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        var buffer = new byte[reader.Length];
        reader.Read(buffer, 0, buffer.Length);
    
        httpResponse.ContentType = "application/pdf";
        httpResponse.BinaryWrite(buffer);
        httpResponse.End();
    }