0

ASP.NET Web API で実装されたサービスに CSV エクスポートを追加しています。

現在、ビュー モデル (結果フィルタリングの詳細を含む) があり、これは ajax POST 要求を介して Web API コントローラーに送信されます。次に、JSON 応答が UI にレンダリングされます。これはうまくいきます。

同じビューモデルを別のコントローラーに投稿したいので、名前を付けましょうExportController。次に、ファイルをユーザーにダウンロードする必要があります。

私の考え:

  1. ビュー モデルをサービスに投稿し、永続ストレージ (DB またはメモリ内キャッシュは関係ありません) のどこかに保存し、エクスポート トークンをユーザーに返します。(エクスポートトークンとは、この特定のエクスポートを識別するために使用される情報の一部を意味します)

  2. 次に、そのトークンを URL に指定してGETからリクエストを実行し、このリクエストに対するレスポンスとしてファイルを取得します。iframe

UIで私が今持っているもの:

var exportUrl = "URL to ExportController"
$.ajax(exportUrl, {
   type: 'POST',
   contentType: 'application/json',
   data: postData
})
.success(function(data) {
    // this should download the file
    $('#export').attr('src', exportUrl + '&exportToken=' + data);
});

ここで「#export」はiframe、ファイルのダウンロードに使用される要素です。

そして、これはエクスポートバックエンドの生のスケッチです:

public class ExportController : ApiController
{
    ...

    // GET /api/Export
    public string Get(string exportToken)
    {
        // get filters from DB
        var filters = ExportArgumentProvider.GetFilters(exportToken);

        // get data
        var result = DataSource.GetData(filters);

        return result;
    }

    // POST /api/Export
    public string Post(FilterInput filters)
    {
        var guid = Guid.NewGuid();

        // save filters to DB
        ExportArgumentProvider.AddFilter(guid, filters);

        return guid.ToString();
    }
}

この疑似コードは明らかに機能しません。Get メソッドの戻り値の型は無視してください。

だから、質問:

  1. このエクスポートを行う簡単な方法はありますか (フィルター状態を DB に保存せずに)。
  2. このアプローチは正気ですか (DB などに保存された状態)、またはそのようなタスクは別の方法で実行する必要がありますか?
  3. ASP.NET Web API はそのようなタスクに適していますか、それともエクスポートには通常の ASP.NET コントローラーを使用する必要がありますか?

UPDATE : サーバーに投稿されたデータは URL の長さの制限を超える可能性があるため、GET リクエストを介して渡すことは実際にはオプションではありません。

4

2 に答える 2

0

2 つのリクエストを 1 つにまとめることをお勧めします。「エクスポート」URL にすべてのパラメータを指定して、「その場で」エクスポートを実行します。クエリ文字列には非常に多くのデータしか詰め込めないというわずかな制限があるため、これはうまくいかないかもしれませんが、それをお勧めします (問題がかなり単純化されるため)。

「postData」(コンポーネントの最初の部分) が「十分に小さい」と仮定すると、それを「エクスポート」URL のクエリ文字列にシリアル化し、エンドポイントを結合するだけです (エクスポート URL がフィルタリングを処理するように)。のデータなど)。

于 2012-09-05T21:59:06.770 に答える
0

このプロジェクトでは、クリーンで RESTful なバックエンドの作成をあきらめExportController、通常の MVC コントローラーに変換しました。次に、この行をPostメソッドで変更できました

ExportArgumentProvider.AddFilter(guid, filters);

の中へ

Session[exportId] = filters;

メソッドで同じことを行いGetます。

DBにフィルターを保存するアプローチの方がはるかに優れていると思いますが、

  1. ここでは REST API は必要ありません。
  2. これは、「API の純粋性のためだけに」追加したい以上に、コードにあまりにも多くのオーバーヘッドをもたらします。
于 2012-09-18T13:01:55.133 に答える