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

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

新規登録して質問してみよう
ただいま回答率
85.47%
C#

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

ASP.NET Web API

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

Q&A

解決済

1回答

1851閲覧

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

SUPER_SLiNKY

総合スコア76

C#

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

ASP.NET Web API

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

0グッド

0クリップ

投稿2019/08/11 05:42

編集2019/08/11 06:04

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/11 05:58

ASP.NET Web API の話なら ASP.NET のタグを付けてください。分割するのはどういう理由ですか? チャンク形式でエンコーディングしてブラウザにダウンロードするという話とは違いますか?
SUPER_SLiNKY

2019/08/11 06:06

タグを追加しました。 分割する理由ですが、質問にも書かせて頂いたとおりクライアント側で進捗率を表示させたいからです。 クライアント側はWindowsFormでJsonで取得したデータをグリッドビューに表示させています。
退会済みユーザー

退会済みユーザー

2019/08/11 06:22

HTTP 通信ですから、クライアント側から定期的に Web サーバーに要求をかけて進捗情報を入手するということになると思いますが、サーバー側でそういう情報を提供する仕組みは作れるのでしょうか? そういうことをしたいというのは、応答が返ってくるまでに時間がかかるからであろうと想像していますが、どこで時間がかかっているのでしょう? それによってどうすべきかの話が変わってくると思うのですが。
SUPER_SLiNKY

2019/08/11 06:41

サーバー側でそういう情報を提供する仕組みは作れるのでしょうか? ⇒ そこをどう作ればいいのか今悩んでいます。 HTTP通信の事はあまり詳しくないのですが、クライアントから1回のリクエストに対してサーバー側でデータを複数回に分割して簡単に送信する仕組み(関数?)とかあるのかなぁと思いました。 応答が返ってくるまでに時間がかかるからであろうと想像していますが、どこで時間がかかっているのでしょう? ⇒ 今はデータが少ないので実際に時間はかかっていないのですが、今後データが増えたときに通信中のアニメーションだけではなく進捗率も欲しいと考えています。 時間がかかるとしたら、クライアント側で言うとSendAsyncでリクエストを投げてから返ってくるところでしょうか? HttpResponseMessage response = await client.SendAsync(request);
退会済みユーザー

退会済みユーザー

2019/08/11 07: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 07:20

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

回答1

0

ベストアンサー

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

投稿2019/08/11 05:53

編集2019/08/11 06:06
gentaro

総合スコア8949

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SUPER_SLiNKY

2019/08/11 07:20

わかりました。そのようなやりかたも相談して検討してみたいと思います。 ありがとうございますm(__)m
KOZ6.0

2019/08/11 10:22

kintone がレコードの分割取得をやっています。 「offset の制限値を考慮したレコード一括取得について」 https://developer.cybozu.io/hc/ja/articles/360030757312 また、有志の方が VB.NET でクラスライブラリを作って公開してくださっています。 「kintoneDotNET」 https://github.com/icoxfog417/kintoneDotNET/tree/master/kintoneDotNET kintone の JSON はちょっと特殊で、シリアライズ/デシリアライズの部分は使えませんが、通信部分のロジックや仕様は大いに参考になるかと思います。
SUPER_SLiNKY

2019/08/12 02:57

ありがとうございます、参考にさせていただきますm(__)m
退会済みユーザー

退会済みユーザー

2019/08/12 05:38 編集

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

2019/08/13 03:35

ああ、なるほど。 代案を提案>その方向でも検討してみます>kintone で似たことをやっているよ という流れですが、 c# – Portable HttpClientの進捗報告を実装する方法 https://codeday.me/jp/qa/20190321/444964.html が、SUPER_SLiNKY さんが本来実現したいことに近いかもしれません。
SUPER_SLiNKY

2019/08/14 08:13 編集

1番最初に考えていたやりたいことは1回のリクエストに対して、サーバー側でデータを分割して何回かに分けて返却するという方法でした。 ただ、それは出来なさそうなのでkintoneのやり方なのですが、SurferOnWwwさんの言うとおりかえって時間がかかりそうなので一旦相談してみたいと思います。 KOZ6.0さんが最後に提案していただいた方法はサーバーとの通信処理が終わってからの事みたいなので、たぶんやりたいことと違う気がしますが一応相談してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問