3

REST API から pdf ファイルを返そうとしていますが、次のように ReportController をコントローラーのコレクションに追加しました。

public class ReportController : ApiController
{
    public HttpResponseMessage Get(int id)
    {
        var result = new HttpResponseMessage(HttpStatusCode.OK);
        string fileName = id.ToString();

        MemoryStream memoryStream = GetStreamFromBlob(fileName);
        result.Content = new ByteArrayContent(memoryStream.ToArray());
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

        return result;
    }
}

他のコントローラーはすべて正常に動作しますが、シリアル化可能なオブジェクトまたはオブジェクトのコレクションではなく、HttpResponseMessage を返すように設定された最初のコントローラーです。

ただし、クライアント側からこれを消費するのは困難です。これを行うために多くのバージョンのコードを試しましたが、コントローラ コードがヒットすることはなく、これを呼び出す成功した方法の完全な例はほとんどないようです。以下は私の現在のバージョンです: -

public async Task<string> GetPdfFile(int id)
{
    string fileName = string.Format("C:\\Code\\PDF_Client\\{0}.pdf", id);

    using (HttpClient proxy = new HttpClient())
    {
        string url = string.Format("http://localhost:10056/api/report/{0}", id);
        HttpResponseMessage reportResponse = await proxy.GetAsync(url);  //****
        byte[] b = await reportResponse.Content.ReadAsByteArrayAsync();
        System.IO.File.WriteAllBytes(fileName, b);
    }
    return fileName;
}

ただし、行****はメッセージで失敗しますNo connection could be made because the target machine actively refused it 127.0.0.1:10056

私が言うように、他のコントローラーは正常にhttp://localhost:10056/api/動作します。

これは、WEBAPI サーバー メソッドからファイルを取得する正しい方法ですか?

await/async の使用や、コントローラーがファイルを返すためのより良い方法など、コードの他の領域について何かアドバイスはありますか?

4

1 に答える 1