0

応答ストリームに書き出そうとしていますが、失敗しています。データが何らかの形で破損しています...

他の場所に保存されているストリームを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();
        }
    }

よろしくお願いします

4

1 に答える 1

4

バイトではなく文字を書いているからです。文字は絶対にバイトではありません。エンコードする必要があり、それが「破損」の出番です。代わりに次のようにします。

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();
}
于 2009-11-12T17:49:33.177 に答える