「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>アプリケーション設計のポイント]] *目次 [#l07a868e] #contents *概要 [#oc157d98] 「[[通信制御機能]]」開発の試行錯誤を纏めておく。 -「[[通信制御機能]]」で最も成功したのは、.NETオブジェクトのバイナリ転送する[[汎用性>#f7d9c2da]]の高いWebAPI。 --これが実現できたのは、.NETのBinarySerializer が強力だったため。 --この場合、下位のプロトコルはなんでも良い。何を使用しても問題なく利用できる。 --問題があるとすれば、[[相互運用性>#e3ce4135]]が無い(異なるテクノロジ間をブリッジできない)というところ。 -次に成功するだろうと思われるのは、REST JSON、JSON-RPCの個別インターフェイス。~ 特に特徴は無いが、ソレ以外の通信方式に問題があるということかと考える。 *ポイント [#ic1ef259] **汎用性 [#f7d9c2da] ***要素 [#reea05d2] -WebAPIはなるべく汎用的に定義したい(インターフェイス定義を増やしたくない)。 -この場合、インターフェイス記述、データ記述言語は1つだが、その中を通るデータのフォーマットが可変となる。 -何かをキーにして、中を通るデータをパースする先の型が明確になればイイだけだが、~ これは、インターフェイス記述、データ記述言語の次の段階のオブジェクト構造やバイナリ表現の話になる事が多いため、~ そもそも、汎用性を追求してしまうと、[[相互運用性>#e3ce4135]]に問題が発生するものと考える。 ***例 [#e0488a61] -.NETオブジェクトのバイナリ転送がまさにこれに該当する([[相互運用性>#e3ce4135]]は無い)。 -SOAPやXML/JSONでも可能だが、SOAPやXML/JSONの[[相互運用性>#e3ce4135]]に問題が発生する。 **相互運用性 [#e3ce4135] SOAPやXML/JSONなどは相互運用性があるインターフェイス記述、データ記述言語であると言える。 ***データ・フォーマット [#c6b16bd8] -異なるテクノロジ間で相互運用性を高めるには、~ データ記述言語でデータ・フォーマットが標準化されている必要がある。 -[[汎用性>#f7d9c2da]]を高めるために、さらにその中を通る~ データ・フォーマット(オブジェクト構造やバイナリ表現)を規定し出すと、~ これは=言語レベルの話になることが多く、相互運用に問題を与える。 ***パーサー [#cd5d93a3] また、各言語向けのパーサーが拡充してくる必要がある。~ SOAPやXML/JSONなど、標準化されているため各言語向けのパーサーの提供を受けやすい。 ***例 [#tb303f1f] -SOAP --インターフェイス記述言語はWSDL、データ記述言語はXML。 --サーバーがWSDLを生成し、クライアントはWDSLを理解してプロキシを生成する。 --これで相互運用は可能だが、ライブラリがスクリプト言語には供給されなかった。 -XML --インターフェイス記述言語は無く、データ記述言語としてXMLを使用する。 --XMLパーサーが必要だが、JavaScriptなどのスクリプト言語には提供されていないことがある。 --JSONと同じく、REST APIを開発可能であったが、JSONのRESTがデファクトになりXMLのRESTは廃れた感がある。 -JSON --インターフェイス記述言語は無く、データ記述言語としてJSONを使用する。 --各言語間でBean(POJO/POCO)、Genericのパースが同じフォーマットで行われる。 --特にJSONは仕組みが簡単なため、スクリプト言語含めて相互運用が可能になった。 *技術的な問題 [#z3008006] **[[WCF>https://techinfoofmicrosofttech.osscons.jp/index.php?WCF]] [#l994e898] ***概要 [#da22110b] WCFのデータコントラクトは、 -相互運用性の低いバイナリ転送や、SOAPには適合した方式だったが、 -XML/JSONレベルの相互運用性には、問題を起こした。 ***バイナリ転送や、SOAP [#x8c3fd2a] バイナリ転送や、SOAPはあまり相互運用性を気にする必要は無いため問題は少ない。 -WCFのTCP/IP(バイナリデータなので相互運用することが少ない) -WCFのSOAP(WSDLで相互運用が保証されている。) ***XML/JSON [#k2bacbc6] -しかし、XML/JSONについては、データコントラクトはミスマッチ -理由は、データコントラクトを交換できるということは、 --オブジェクト構造やバイナリ表現が一致しているか、 --WSDLのような、インターフェイス記述言語が必要だった。 -このため、初期のパーサーは相互運用性が殆ど考えられていなかった。 --このため、XML/JSONなどのRESTfulなAPIを定義するには、WCFは向いていなかった。 --しかし、中期以降は、データコントラクト無しでデータの送受信が可能になった。 **[[汎用DTO]] [#ffa6d900] ***概要 [#ka1d94d3] -DataTableを異なるランタイム間で交換できるようにするために作成した。 -具体的には、.NET FrameworkとSilverlight間でDataTableを交換する。 -ランタイムが異なっても、オブジェクト構造を維持してデータ交換できる優れモノ ***パーサーの問題 [#n16e3792] -しかし、実装量が多く、パーサーを各言語に向けて提供するのは無理があった。 -DataTableはBean(POJO/POCO)、Genericと比べて廃れた感があるが、~ 複雑なデータアクセスをするエンタープライズ・システムでは依然として重宝する。~ このため、各言語に向けてパーサーが提供されればイイ気もするが、しかし、その兆候は無い~ (これは、エンタープライズ・システムを実装する言語が限られているためかもしれない)。 ***今後の展望 [#eef1812d] -.NET Frameworkと.NET Core間のデータ転送に重宝するかもしれない。 -.NET Standard2.0からは、DataTableが供給されているもよう。~ このため、XmlSerializerを使用すればデータ交換ができるようになるかもしれない。 **OpenAPI / Swagger [#pc33d888] REST 用のインターフェイス記述言語っぽが、多分、流行らないと思う。 -Swagger (OpenAPI) - マイクロソフト系技術情報 Wiki~ https://techinfoofmicrosofttech.osscons.jp/index.php?Swagger%20%28OpenAPI%29 *参考 [#g7f91197] **[[Webサービス]] [#he20cf95]