16

ファイル ID のリストを渡され、それらのファイルのサムネイル画像を返す ASP.NET MVC 4 Web Api コントローラー メソッドがあります。

そのため、クライアントは数値 ID (例: 10、303、29) のリストを渡すことができ、メソッドは ThumbnailImage が次のように見える List を返します。

class ThumbnailImage
{
    public int Id { get; set; }
    // Some other stuff
    public byte[] RawData { get; set; }
}

発信者が項目ごとに 1 回の呼び出しを行うのではなく、ID のリストを渡す理由は明らかです。ダウンロードする項目が数十または数百ある可能性があり、ダウンロードに必要なすべての HTTP トラフィックを回避しようとしています。個別にダウンロードしてください。

現在、RestSharp と JSON.NET を使用しているため、ThumbnailImage オブジェクトは JSON としてネットワーク経由で渡されます。コーディングの単純さの観点からは問題ありませんが、JSON はそのバイナリ データを表現する効率的な方法ではありません。

したがって、生のバイトをオクテット ストリームとして返す必要があると考えています...ただし、単一の画像に対しては簡単に行うことができますが、複数の画像に対して行う最善の方法はわかりません。特に、各ファイルの ID やその他の情報を返す必要がある場合は特にそうです。(結果は必ずしも特定の順序で返されるとは限らず、一部のファイルが欠落している可能性があるため、ID が必要です)。

単純にすべてを断片的に応答ストリームに書き込むことができます。そのため、各項目に対して ID (適切にエンコードされたもの)、続いて画像データの長さ、画像データ自体、そしてその後に同じものが続きます。次の項目など

呼び出し元は、ID のエンコーディング (および長さ!) などを想定して、ストリームが使い果たされるまでストリームから読み取り続けるだけでした。

私はそれがうまくいくと思いますが、それは不格好に思えます - より良い方法はありますか?

4

3 に答える 3

16

OK、KiranChalla が参照した MultipartContent を使用して、動作するように見えるコードのスニペットを次に示します。(これは、JSON でエンコードされた「オブジェクト」(この場合は単なる整数 ID のリスト) と組み合わせて、異なるタイプの 2 つのファイルを返す方法を示す単なるダミー サンプルです)。

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;
}
于 2012-09-08T21:14:38.017 に答える
1

私が目にする課題の 1 つは、送り返される画像の数に基づいて、発信者がタイムアウト値を調整する必要があることです。これが書店の場合、大量の画像が送り返される可能性があります。

各画像の URL のみを送り返し、実際の画像を取得するのは発信者に任せたらどうなるでしょうか? 複数の呼び出しでトラフィックが少し増えることを意味しますが、発信者は遅かれ早かれ情報を取得し、発信者の要件に基づいて画像を取得します。

私は間違っているかもしれませんが、残りの背後にある考え方は、多数の画像をまとめてリソースと呼ぶのではなく、各リソースを識別することだと思いました。ちょっとした考え...

于 2012-09-04T16:48:09.620 に答える
1

すべてのサムネイルから圧縮ファイル (ZIP ファイルなど) を作成し、それを送り返すことができます。

次に、発信者は最後にそれを解凍する必要があります-複数のファイルを含む単一のファイルを送信することは、単一のストリームで複数のファイルを送信するよりもはるかに受け入れられます.

欠点は、キャッシュを利用できる可能性が低いことです (もちろん、使用パターンによって異なります)。

于 2012-09-04T15:14:33.837 に答える