C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

クラウドでDBの使用方法

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■97040 / inTopicNo.1)  クラウドでDBの使用方法
  
□投稿者/ gnew (1回)-(2021/03/19(Fri) 10:45:48)

分類:[VB.NET/VB2005 以降] 

2021/03/19(Fri) 10:46:26 編集(投稿者)

以前に作成したWinFormアプリ(VB2013・Framework4.5)を改造したいと思います。
従来、このアプリで使用するデータを各ユーザーに配布していましたが、
データの蓄積が多くなってきたので、配布データをクラウドDBに配置し、
各端末からDBデータを参照してもらおうと思っています。
一般ユーザーは主に選択クエリ(SELECT)を要求し、
管理者は更新クエリ(INSERT・UPDSTE・DELETE)を要求します。

クラウドに何を使うか、DBは何を使うかについては別途考えていますが、
クライアントのWinFormの形態はそのままです。(使用Frameworkは更新予定)
その場合、クライアント(WinFormアプリ)とクラウドDB間のやり取りは
どのようにするのが良いでしょうか?

クライアント側からクラウドDBに直接SQLを投げて、その結果をクライアント側が
直接受け取ることが出来るような仕組みが用意されているのか分かりません
(そもそも直接SQLを投げることに対するセキュリティー上の問題は不明ですが)

現在Webアプリの仕組みを勉強中のため、知識に乏しい僕の考えとしては、
ざっくりとですが、以下の方法で実現できるのかな?という程度です。
・クライアントからクラウドにクエリを実行するためのパラメータを送信。
・クラウド側で受け取った条件パラメータを元にSQLを実行。
・その結果をクライアントに返す。

この実現のため、
・クラウド側に、SQLの実行およびその結果をXML等で返すようなWeb APIを作成
・WinForm側は、Web APIに必要パラメータをPOSTしてそのレスポンスを受け取る
 (Http&#8203;Clientを使用?)
ということをイメージしています。

この考えは合っているのか、それとも、現在の主流は全く別の方法なのか、
もしかしたらシステムの規模や他の要因で答えが変わるのかも知れませんが、
色々と勉強したいので、アドバイスを頂けないでしょうか。
引用返信 編集キー/
■97041 / inTopicNo.2)  Re[1]: クラウドでDBの使用方法
□投稿者/ 774RR (862回)-(2021/03/19(Fri) 11:00:51)
直接 The Internet につながっているマシンは猛烈に攻撃を受けるのでお勧めできないっス
つまりデーターベースサーバーを直接 The Internet につなぐのは普通にはあり得なくて
つないでよいのは http サーバのみ Apache httpd であるとか IIS であるとか。

多くの web アプリは front / back みたいに物理的にネットワーク分離するのが普通
front とは httpd なり IIS
back はデータベース

ってことでごく普通の web application 構成になってしまうでしょうね
クライアント側も Win Forms の皮をかぶった web UA にならざるをえないし
そうなんだった最初から Edge や Chrome で開くフツーの web page にしたほうが手早い

> クライアント(WinFormアプリ)とクラウドDB間のやり取りは
ごく普通に http による POST と GET ってことになりそう。
引用返信 編集キー/
■97042 / inTopicNo.3)  Re[1]: クラウドでDBの使用方法
□投稿者/ WebSurfer (2203回)-(2021/03/19(Fri) 11:01:26)
No97040 (gnew さん) に返信

> この実現のため、
> ・クラウド側に、SQLの実行およびその結果をXML等で返すようなWeb APIを作成
> ・WinForm側は、Web APIに必要パラメータをPOSTしてそのレスポンスを受け取る
>  (Http&#8203;Clientを使用?)
> ということをイメージしています。
>
> この考えは合っているのか、それとも、現在の主流は全く別の方法なのか、

合っていると思います。XML に代えて JSON を使うとより「現在の主流」に近くなる
と思います。
引用返信 編集キー/
■97043 / inTopicNo.4)  Re[2]: クラウドでDBの使用方法
□投稿者/ gnew (2回)-(2021/03/19(Fri) 11:16:13)
774RR様、WebSurfer様、アドバイスありがとうございました。

> XML に代えて JSON を使うとより「現在の主流」に近くなる

なるほど、勉強します。

皆様、ありがとうございました。
解決済み
引用返信 編集キー/
■97044 / inTopicNo.5)  Re[1]: クラウドでDBの使用方法
□投稿者/ 魔界の仮面弁士 (3017回)-(2021/03/19(Fri) 12:48:38)
2021/03/19(Fri) 12:56:45 編集(投稿者)

No97040 (gnew さん) に返信
> ・クラウド側に、SQLの実行およびその結果をXML等で返すようなWeb APIを作成
> ・WinForm側は、Web APIに必要パラメータをPOSTしてそのレスポンスを受け取る
>  (Http Clientを使用?)
> ということをイメージしています。

自分のところだと、昔ながらの SOAP を使っているケースと、
Swagger を使っているケースがあります。(WCF は使ってない)
サーバー側は IIS。

これらの手法だと、XML 化や JSON 化は勝手に行われるので、
フォーマットそのものを意識する必要はあまり無いです。
クライアント側も、各クラスのメソッドを呼ぶだけで、
プログラムから、随時 URL を直接組み立てたりする必要もありません。


=== SOAP の場合 ===

前者(SOAP)は古くからある実装で、XML によるデータ交換です。
XML はデータが肥大化しやすい傾向にあるのと、生データの目視性が悪いので、
自分の所では、新規案件ではあまり採用していません。
https://www.atmarkit.co.jp/fdotnet/chushin/introwinform_10/introwinform_10_01.html
http://square.umin.ac.jp/hiroino/oldsite/webservenote1.html

サーバー側は、ASP.NET 側で [新しい項目の追加] - [Web サービス (ASMX)] を追加して、
 <WebMethod()> Public Function Get何某(引数) As 型付DataSet
 <WebMethod()> Public Function Update何某(ds As 型付DataSet) As 更新結果
なメソッドを追加するだけ。

受け渡しは 別に型付 DataSet でなくても、Integer でも String でも List(Of ) でも自作クラスでも OK です。
ただし永続化処理の都合上、DataTable を単体で Return するのはあまりお奨めしません。

完成すると、こんな感じの Web API が出来ます。
http://www.dneonline.com/calculator.asmx


SOAP クライアントの方は、VB の参照設定時に[参照の追加]ではなく [Web 参照の追加] を
選べば、上記の .asmx な URL の Web サービスを参照設定できます。
ただしそれは 2008 ぐらいの世代まで。最近の VB だと階層が深くなっていて、
まず [サービス参照の追加]を選び、ダイアログ左下の [詳細設定] から
[サービス参照設定]を開かないと、[Web 参照の追加] 画面に辿り着けません。

で、[Web 参照の追加] 画面まで来たら、.asmx な URL を入れた後、
Web 参照名の欄に任意の文字列を入れて、[参照の追加]を選択。

そうすればあとは、
 Dim result = My.WebServices.Calculator.Add(10, 20)
のような感じで利用できます。サーバー側の実装がどうなっているのかは
あまり意識しないで済みます。



=== Swagger の場合 ===

これ自体は REST API による通信ですが、SOAP における ASMX のように、
メソッド定義を参照可能な情報として公開できるので、プログラムから呼びやすいです。

後者の資料としてはこのあたり。
自分は .NET Framework 版の ASP.NET Core MVC で実装しています。認証処理は JwtBearer を選択。
http://blog.studio-odyssey.net/2017/11/aspnet-core-20-web-api-client-.html
https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/getting-started-with-swashbuckle?view=aspnetcore-3.1&tabs=visual-studio

バージョンごとに若干の癖があるようで、ASP.NET Core MVC の場合は、
ApiContoller クラスは通常使わないようです(ASP.NET 4.x Web API 2 互換)。

ASP.NET Core 2.0 だと、MVC コントローラーと API コントローラーの両方とも、
Controller クラスから継承します。

ASP.NET Core 2.1/2.2 だと、
MVC コントローラーは Controller から継承され、
API コントローラーは ControllerBase から継承されます。

Public Class MyMvc21Controller : Inherits Controller
 
<Route("api/[controller]")>
Public Class MyApi21Controller : Inherits ControllerBase
 
Web メソッドの戻り値は、Sub でも良いし、Function にするなら
As T / As ActionResult(Of T) / As ActionResult など。

HTTP Status として 200 OK しか返さないなら、Sub か As T で良いですが、
データの構成によって 200 以外も返したいなら ActionResult 推奨。


Web 側を実装すれば swagger.json が自動生成されるので、それを
https://editor.swagger.io/
に放り込んで、[Generate Client]-[csharp] を選べば、
.NET Framework 4.x 向けの DLL プロジェクトがダウンロードできます。

それ自体は C# なソースですが、それをそのまま VB からプロジェクト参照すれば、
 Dim api As New IO.Swagger.何某.何某()
 Dim data = api.Get何某(…)
 api.Put何某(…)
みたいにして、普通のクラスのように利用できます。


IIS 以外の環境(.NET 以外)のクラウド環境で開発する場合も、
サーバー側として SOAP や Swagger を選択して連携することができます。

もちろんこうしたフレームワークを用いず、
REST API を直接サーバー側に実装するという選択肢もアリ。

なお、非 .NET 環境で生成した SOAP 実装の場合、XML 構造によっては、
VB の [Web 参照の追加] で解釈できないケースがあるので注意が必要です。
(そもそも、ASMX を公開しない SOAP 実装もありますが…)
解決済み
引用返信 編集キー/
■97045 / inTopicNo.6)  Re[2]: クラウドでDBの使用方法
□投稿者/ gnew (3回)-(2021/03/19(Fri) 14:45:16)
魔界の仮面弁士様、情報提供ありがとうございました。
今回はIIS以外を使用する予定ですが、
頂いた情報は勉強させて頂きます。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ