2017-06-08 18 views
0

Web api経由でBase64エンコードされた文字列として画像を返すときに '414(Request-URI Too Long)'エラーが発生します。Web API経由で画像を返す方法

私は現在、私のウェブ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の代わりにstreamを使用することを強くお勧めします。その効率的かつ高速です。 UPDATE 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; 
} 

が、これはあなたの問題を解決することを願っています。

+0

この例では、イメージを返すだけのコントローラに別のアクションを作成する必要がありますか? –

+0

これは明らかです。 Task >の代わりにHttpResponseMessageを返します。ストリームとしてファイルを読み込み、サンプルコードのように返します。 – David

+0

これらのソリューションは私にとってはうまくいかず、次のようになります。リソース:net :: ERR_NAME_NOT_RESOLVED –

関連する問題