質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • C#

    9667questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET Web API

    15questions

    ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。

C# WebApi Jsonデータを分割して返す方法について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 118

SUPER_SLiNKY

score 35

C#のWebApiでJsonデータを返却する際に、まとめてではなく何回かに分割して返却したいのですが可能でしょうか?

今はHttpClientのSendAsyncを使ってクライアントから送られてきた検索条件をもとにデータを取得し、1000件であれば1000件まとめて返しています。
可能であれば100件ずつとか返却し、クライアント側で進捗率みたいなものを表示できればと考えています。

   [HttpPost]
        [ActionName("json")]
        public HttpResponseMessage GetJson([FromBody]string condition)
        {
          //データ取得処理

            return  Request.CreateResponse(System.Net.HttpStatusCode.OK, "ここに入るデータを何回かに分割して返却したい");
        }

以下、開発環境
Visualstudio2013
.netFrameWork:4.7.2

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SUPER_SLiNKY

    2019/08/11 15:41

    サーバー側でそういう情報を提供する仕組みは作れるのでしょうか?

    そこをどう作ればいいのか今悩んでいます。
    HTTP通信の事はあまり詳しくないのですが、クライアントから1回のリクエストに対してサーバー側でデータを複数回に分割して簡単に送信する仕組み(関数?)とかあるのかなぁと思いました。

    応答が返ってくるまでに時間がかかるからであろうと想像していますが、どこで時間がかかっているのでしょう?

    今はデータが少ないので実際に時間はかかっていないのですが、今後データが増えたときに通信中のアニメーションだけではなく進捗率も欲しいと考えています。
    時間がかかるとしたら、クライアント側で言うとSendAsyncでリクエストを投げてから返ってくるところでしょうか?
    HttpResponseMessage response = await client.SendAsync(request);

    キャンセル

  • SurferOnWww

    2019/08/11 16:07

    > クライアントから1回のリクエストに対してサーバー側でデータを複数回に分割して簡単に送信する仕組み(関数?)とかあるのかなぁと思いました。

    そういうのは、自分が知る限りですが、チャンク形式にする以外はないと思いますが、これは質問者さんのやりたいこととは違うようです。チャンク形式とはどういうことかは以下の記事を見てください。

    http://surferonwww.info/BlogEngine/post/2016/12/14/downloading-file-by-using-chunked-encoding.aspx

    > 時間がかかるとしたら、クライアント側で言うとSendAsyncでリクエストを投げてから返ってくるところでしょうか?

    そこは第三者には分からないですが、仮にそうだとすると、Web サーバーが応答を受け取って DB サーバーにクエリを投げて、DB サーバーからデータが入手できて、それを Web アプリで JSON 形式に加工するまでの時間ということになりますよね。

    でも、そのプロセス全体にかかる時間と現在の進捗が分かるかと言われると、どうやったらいいのかは自分は見当がつきません。

    何にせよ、質問者さん自身もどこで時間がかかりそうか現在のところ分からないようですが、そうだとすると適切な答えは見つからないと思います。

    最終的に DataGridView に応答を表示するということですが、ユーザーに 1,000 行も表示するのでしょうか? そうであっても 1,000 行ぐらいなら進捗を表示するまでもなく瞬時に応答が返ってくるのではないかと思うのですが、いかがですか。

    キャンセル

  • SUPER_SLiNKY

    2019/08/11 16:20

    わかりました。簡単には出来なさそうですねありがとうございます。m(__)m

    キャンセル

回答 1

checkベストアンサー

0

APIが引数で取得を開始する位置と件数を受り、戻り値の中に「続きがあるか」の情報を持たせるインターフェイスにしておいて、クライアント側から「何件目から何件(質問の例では100件固定だけど)取得」という呼び出しを必要なだけ回せばいいのでは。(そういう作りは結構あると思う)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/12 14:37 編集

    合計 1000 レコード取得するのに 100 レコードずつ 10 回クエリを DB サーバーに投げて 10 回に分けて取得するというような話なのでしょうか? そうだとすると、10 回の内に誰かが DB を更新したりすると不整合が出そうですし、そもそも進捗を表示するためだけにそこまでするメリットはあるのでしょうか? 今は問題ないが、この先取得するレコードが増えると応答が返ってくるまでに時間がかかるかもしれないから、杞憂かも知れないけど、進捗を表示する方法を考えておきたい・・・という話だったはずです。10 回に分ければかえって時間がかかりそうな感じですけど。

    キャンセル

  • 2019/08/13 12:35

    ああ、なるほど。
    代案を提案>その方向でも検討してみます>kintone で似たことをやっているよ
    という流れですが、

    c# – Portable HttpClientの進捗報告を実装する方法
    https://codeday.me/jp/qa/20190321/444964.html

    が、SUPER_SLiNKY さんが本来実現したいことに近いかもしれません。

    キャンセル

  • 2019/08/14 17:09 編集

    1番最初に考えていたやりたいことは1回のリクエストに対して、サーバー側でデータを分割して何回かに分けて返却するという方法でした。

    ただ、それは出来なさそうなのでkintoneのやり方なのですが、SurferOnWwwさんの言うとおりかえって時間がかかりそうなので一旦相談してみたいと思います。

    KOZ6.0さんが最後に提案していただいた方法はサーバーとの通信処理が終わってからの事みたいなので、たぶんやりたいことと違う気がしますが一応相談してみます。

    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9667questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET Web API

    15questions

    ASP.NET Web APIはブラウザやモバイル機器のようなクライアント向けのHTTPサービスを構築するフレームワークです。Microsoft .NET Frameworkがベースになっており、RESTfulサービスを構築するには理想的です。