Контроллер API продолжает возвращать JSON после изменения типа контента на другой - PullRequest
0 голосов
/ 25 октября 2019

Я пишу контроллер API и пытаюсь заставить его вернуть файл jpg. Однако даже если тип содержимого установлен на «application / jpg», мое ответное сообщение продолжает возвращать json.

    public HttpResponseMessage Get()
    {

        var path = @"C:\Temp\Sample\background.jpg";

        var result = new HttpResponseMessage(HttpStatusCode.OK);
        var stream = new FileStream(path, FileMode.Open);
        result.Content = new StreamContent(stream);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/jpg");
        result.Content.Headers.ContentType.MediaType = "application/jpg";
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "background.jpg"
        };
        stream.Close();
        return result;
    }

После вызова контроллера это то, что он возвращает:

{
    "version": {
        "major": 1,
        "minor": 1,
        "build": -1,
        "revision": -1,
        "majorRevision": -1,
        "minorRevision": -1
    },
    "content": {
        "headers": [
            {
                "Key": "Content-Type",
                "Value": [
                    "application/jpg"
                ]
            },
            {
                "Key": "Content-Disposition",
                "Value": [
                    "attachment; filename=background.jpg"
                ]
            }
        ]
    },
    "statusCode": 200,
    "reasonPhrase": "OK",
    "headers": [],
    "trailingHeaders": [],
    "requestMessage": null,
    "isSuccessStatusCode": true
}

1 Ответ

1 голос
/ 25 октября 2019

Когда выполняются вызовы веб-API, ответы всегда будут в формате JSON (так работает HttpResponseMessages). Если вы хотите отправить изображение через ваш API, два самых простых способа - это отправить ссылку на изображение (если оно размещено) или сначала преобразовать изображение в байтовый массив, например:

 public HttpResponseMessage Get()
{

    var path = @"C:\Temp\Sample\background.jpg";

    var result = new HttpResponseMessage(HttpStatusCode.OK);
    using(var stream = new FileStream(path, FileMode.Open)){        
        var image = Image.FromStream(stream);
        var memoryStream = new MemoryStream();
        image.Save(memoryStream, ImageFormat.Jpeg);
        result.Content = new ByteArrayContent(memoryStream.ToArray());
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
    }

    return result;
}

А на стороне клиента вы можете использовать что-то вроде этого:

        var x = await client.GetAsync("Image");

        using (var memoryStream = new MemoryStream(x.Content.ReadAsByteArrayAsync().Result))
        {
            Image returnImage = Image.FromStream(memoryStream);
        }
...