2017-06-08 88 views
0

當通過web api將圖像作爲Base64編碼字符串返回時,出現'414(Request-URI Too Long)'錯誤。如何通過Web API返回圖像

我目前在我的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

我強烈建議你使用流代替Base64String。它的高效和快速。在這裏你可以找到很好的例子: Returning binary file from controller in ASP.NET Web API

UPDATE 但你不能返回流陣列的網絡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; 
} 

希望這可以解決您的問題。

+0

在這個例子中,我應該在控制器中創建一個單獨的Action來僅返回圖像? –

+0

這很清楚。返回HttpResponseMessage而不是任務>。那麼只需將該文件作爲流讀取並返回,就像示例代碼一樣。 – David

+0

這些解決方案不適合我,我得到以下內容:無法加載資源:net :: ERR_NAME_NOT_RESOLVED –