如何通过Web API返回图像

时间:2017-06-08 08:12:40

标签: c# asp.net .net asp.net-mvc asp.net-web-api

我得到了' 414(Request-URI太长)'通过web api将我的图像作为Base64编码的字符串返回时出错。

我目前在我的Web API控制器中有以下操作:

[System.Web.Http.Route("GetAllEvents")]
public async Task<IEnumerable<Event>> Get()
{
    var vm = EventsViewModel.NewInstance;
    return await vm.GetAllEvents();
}

vm.GetAllEvents()代码:

public async Task<List<Event>> GetAllEvents()
    {
        var result = await DataStore.SelectAll();

        result.ForEach(x =>
        {
            var byteArray = File.ReadAllBytes(x.ThumbnailPath);
            x.ThumbnailEncoded = Convert.ToBase64String(byteArray);
        });

        return result;
    }

我使用WebAPI操作如下:

this.ajaxRetrieve = function(url, data, onSuccessCallback, onErrorCallback) {
    $.ajax({
        url: url,
        data: data,
        type: 'GET',
        async: false,
        dataType: 'JSON',
        success: function(result) {
            onSuccessCallback(result);
        },
        error: function(xhr, status, error) {
            onErrorCallback(xhr, status, error);
        }
    });
}

采取什么更好的方法来避免这种情况发生?

1 个答案:

答案 0 :(得分:1)

我强烈建议你使用stream而不是Base64String。它高效快捷。在这里你可以找到一个很好的例子: Returning binary file from controller in ASP.NET Web API

<强>更新 但你不能用web api返回数组流。所以替代选项是字节数组。像这样的东西:

[HttpGet]
public async Task<List<byte[]>> Get()
{
    var files= await GetAllEvents();

    return files;
}

GetAllEvents()代码:

public async Task<List<byte[]>> GetAllEvents()
{
    var list = new List<byte[]>();
    for (int i = 0; i < 5; i++)
    {
        var byteArray = await Task.Run(() => System.IO.File.ReadAllBytes(@"filePath"));
        list.Add(byteArray);
    }
    return list;
}

希望这可以解决您的问题。