从单个WebApi方法提供多个二进制文件的最佳方法是什么?

Gar*_*ill 14 c# rest asp.net-web-api

我有一个ASP.NET MVC 4 Web Api控制器方法,它传递一个文件ID列表并返回这些文件的缩略图.

因此,客户端可能会传入一个数字ID列表(例如10,303,29),并且该方法返回一个List,其中ThumbnailImage看起来有点像这样:

class ThumbnailImage
{
    public int Id { get; set; }
    // Some other stuff
    public byte[] RawData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

调用者传入ID列表而不是每个项目调用一次的原因应该是显而易见的 - 可能要下载数十个或数百个项目,并且我正在尝试避免所需的所有HTTP流量单独下载它们.

目前,我正在使用RestSharp和JSON.NET,因此我的ThumbnailImage对象作为JSON通过网络传递.从简单编码的角度来看,这很好,但JSON不是表示二进制数据的有效方式.

所以,我认为我应该将原始字节作为八位字节流返回...但是,虽然我可以轻松地为单个图像执行此操作,但我不确定为多个图像执行此操作的最佳方法,特别是当我还需要为每个文件返回ID和其他其他信息时.(该ID是必需的,因为结果不一定以给定的顺序返回 - 并且某些文件可能丢失).

可以简单地将所有内容零碎地写入响应流中,以便为每个项目编写ID(适当编码),然后是图像数据的长度,然后是图像数据本身,然后是相同的内容.下一个项目等

然后,调用者将简单地继续从流中读取,直到它耗尽为止,对ID的编码(和长度!)做出假设等.

我认为这样可行,但看起来很笨 - 有更好的方法吗?

Gar*_*ill 11

好的,这里有一段似乎有用的代码,使用了KiranChalla提到的MultipartContent.(这只是一个虚拟示例,它显示了如何返回两个不同类型的文件,以及一个JSON编码的"对象"(在这种情况下只是一个整数ID列表).

public HttpResponseMessage Get()
{
    var content = new MultipartContent();
    var ids = new List<int>() { 1, 2 };

    var objectContent = new ObjectContent<List<int>>(ids, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
    content.Add(objectContent);

    var file1Content = new StreamContent(new FileStream(@"c:\temp\desert.jpg", FileMode.Open));
    file1Content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("image/jpeg");
    content.Add(file1Content);

    var file2Content = new StreamContent(new FileStream(@"c:\temp\test.txt", FileMode.Open));
    file2Content.Headers.ContentType = System.Net.Http.Headers.MediaTypeHeaderValue.Parse("text/plain");
    content.Add(file2Content);

    var response = new HttpResponseMessage();
    response.Content = content;
    return response;
}
Run Code Online (Sandbox Code Playgroud)

  • 它不适合我.它只返回一个不是有效格式的文件.请帮我.我坚持这个 (2认同)