2017-09-28 10 views
0

JSONのシリアル化に大きな問題があります。c#JSONを使用してラージオブジェクトをシリアライズ

私のアプリには、次の機能がWeb APIコントローラの1つで定義されています。

[HttpGet] 
[ActionName("all")] 
[Route("api/customers/all/")] 
[SwaggerResponse(HttpStatusCode.InternalServerError, Type = typeof(Models.Response.ResponseError))] 
[SwaggerResponse(HttpStatusCode.Forbidden, Type = typeof(Models.Response.ResponseErrorBasic))] 
public Models.Response.ResponseApiList<Models.Api.Customer> GetValuesAll(DateTime? since=null) 

Models.Api.Customerは、いくつかの関連オブジェクトを参照する複雑なオブジェクトです。

public class Customer 
{ 
    public int Id { get;set;} 
    public string Name {get;set} 
    ..... 
    public List<Invoices> Invoices {get;set;} 
    ..... 
    ..... 
} 

Models.Response.ResponseApiListは

public class ResponseApiList<T> 
{ 
    public ResponseMeta meta { get; set; } // ResponseMeta holds datetime and total records 
    public List<T> payload { get; set; } // Holds the Customer object 
    public ResponseApiList() 
    { 
     payload = new List<T>(); 
     meta = new ResponseMeta(); 
    } 

最後に、次はWebApiConfig

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")); 

にNewtonSoft.JSONライブラリがロードされているが、確認していないされて返されたデータを保持していますそれが使用されているかどうかを調べるためのもの。

とにかく、問題はパフォーマンスです。現在、約11,000レコードが処理対象のデータベースから返されますが、データの合計サイズ(フィーダーが通知するものに基づいて)は45Mbsです。

c#コードが関数から返された場合、実行された合計時間は約です。 4秒。

その後、非常に長い間は何もありません。今日私は11:43にプロセスを開始し、15:34まで停止しませんでした。私のテストツールは、ReadyAPI(SoapUI)とInsomniaです。

最終的に、これはページングされた呼び出しに変換され、送信されるデータの量が削減されますが、JSONをWeb APIメソッドから返す制限はありますか?

私がコード変更ルートを下る前に、他の方法でこれを行う方法はありますか?

+0

すべてのJSONシリアライザ/デシリアライザは内部的にReflectionを使用してJSONをオブジェクトに変換します。逆もまた同様です。非常に大きなオブジェクトの場合、最終的には時間がかかりますが、サイズにはどのくらいの時間がかかります。あなたは私がユーザーがそれらをすべて読むことができないと信じているUIに11,000のレコードをすべて表示していますか?代わりに、ページ区切りを使用してオンデマンドでフェッチすることができます。一度にすべてのレコードを取得することで何を達成しようとしているのか教えてください。私は、逐次化のロジックを変更せずに、さまざまなことを実現したいと考えています。 – Rex

答えて

0
  1. まず、このような怪しい反応(45Mb)を送信することは非常に奇妙な考えです。そのような大規模なデータオブジェクトが有用な場合は、私はどのようなケースも発明することはできません。
  2. アイテムのコレクションが多い場合は、ページされた出力が最適です。リミット/オフセットなど。

は最終的に、これは、送信されるデータの量を減らすために、ページングされた呼び出しに変換されようとしているが、Web APIメソッドから戻ってJSONを送るの限界は何ですか?

回答サイズにハードウェブAPIレベルの制限はないと私は考えています。特に、この問題はjson-serializerに関連していません。この非常に大きなレスポンスシナリオの制限は、Webサーバーの設定レベルで表示される可能性が高いです。 (最大応答サイズのようなものなど)。

しかし、この状況の主な結論は、「jsonオブジェクトが45Mbの場合、何かがうまくいかない」ということです。

+0

ありがとうございます。まず、これはdbaのアイデアでした。メインデータベースの一部はiOSアプリに書き込まれ、オフラインでも実行できます。あなたは私の疑惑を確認しました。最後の更新後に変更されたレコードのみを返すように、テーブルに最後に更新された値を追加します。これにより、データはほとんど無くなります。 – gilesrpa

関連する問題