日経SYSTEMS 2011年9月号にVisual Studio LightSwitchの検証があったのでまとめてみる
Visual Studio LightSwitchとは、コーディングなしで、それなりのDBを扱うアプリが作れるというものだ
気になっていたが、出たばっかりということもあり、時間もなく、調査はしていなかった
日経の記事はありがたかったが、どうせすぐに忘れてしまうのでメモ代わりに


  • ずばり「ポストAccess
  • 単一テーブルの編集機能を持つアプリ作成なら実装に10分かからない
  • 印刷機能がないため、フォームやレポートなど凝った帳票が必要な場合には向かない
  • 複数ユーザーが同時にアクセスせず簡易なDB編集機能があればいい、なら使える
  • SQLSERVERからデータを分割して送信する仕組みになっているため、DBに負荷はかからない
  • ただしドロップダウンリストを使い、かつデータが多い、複数テーブルにまたがったりする場合は表示に時間がかかることがある
  • 外部DBとして、SQLServer2005以降、Azure,SharePoint,WCF RIAなどが可能
  • テーブルからクラスを作る時に、表示名が見出しとして使われるので、適切な日本語名にすること
  • 入力チェックはメソッドに書く
  • ヘッダをクリックすると並び替え、検索ボックスに入力で絞り込み、などの機能が標準でついてる。VSではコーディングしないと無理
  • 画像の表示や登録が可能。VSにはそんな機能がないので、コードが必要。画像を扱うアプリを作る時には便利
  • Excelエクスポート機能標準装備。コーディング不要。ただしこのエクスポートはExcelを起動して書きだすものなので、EXCELインストールしてないパソコンでは使えない
  • 印刷機能が使えないのが痛い。VSのコンポーネントも使えない。帳票使いたいならACCESSのほうがよい
  • Webアプリにも変換可能。プロパティ変更するだけ。コーディング不要。Azure展開も可能
  • WebアプリはHTMLではなくSilverlight形式であるので注意。よってプラグインが実行に必要
  • 処理速度は合格。ページングを自動でしているらしく、パフォーマンスはよい
  • が。どうやらリレーションシップを行うと性能が著しく下がるようだ。リレーションしたテーブルの内容でドロップダウンリストを使うと、1万5千件のデータ表示に4,5分
  • 非接続型である。保存を押さないと更新されない。同様に「最新の情報に更新」を押さないと最新データは読み込めない。リアルタイム更新系アプリの作成には向かない
  • 排他処理は標準で実装されているので実にたすかる。競合を検知するとメッセージが出る

さて、WSDLってのがよくわかってないが、ちまたのものを参考にする

http://codezine.jp/article/detail/199
http://soap.amazon.co.jp/schemas3/AmazonWebServices.wsdl

この辺はとても勉強になった

作ったWebサービスは文字列を渡したら検索結果を戻すもの
Amazonなどの検索サービスと思ってもらっていい。本の情報の構造体の配列を返す

配列はWSDLでは


<xsd:complexContent>
<xsd:restriction base="soapenc:Array">
<xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="typens:Details[]" />
</xsd:restriction>
</xsd:complexContent>


こんな感じで定義するようだったので、設定してみるのだが、"soapenc:Array"が何度やっても.NetのWSDLエディタ
でエラーになる
restriction,attributeの行で "Array~要素はこのコンテキストではサポートされません"
的なエラーが出る

しかしどこのサンプルを見てもこの書き方
どうやらsoapenc自体を「そんなものはしらん」と思っているらしい。バカなー

ちなみにPHPで呼び出すと動きます。.Netだと動かない。

そしてすでにどこで見つけたかも忘れたが、外国の掲示板で同じように苦しんでいる人がいて、
「.Netではsoapencは使えないから、全部消せ」みたいな返事をしている(のではないかと思われる)のを発見
ほんとかどうかしらないが、たしかにsoapencでエラーになっていたのは確かなので、soapencを消すと動く

でも配列使いたいんだけどどうすればいいんだ

またあれこれ調べる。
今自分が書いているのはRPC/ENCODEといわれる形のWSDLだ。
だってそのサンプルが圧倒的に多かったから
んで、どうやら.NetはLiteral/Document推奨らしい

ようわからんが、Literal式にしてみよう

配列はこれを参考にする
http://msdn.microsoft.com/ja-jp/library/aa979697(v=office.12).aspx

literalでの受け渡しはこれがわかりやすい
http://133.145.224.19/Prod/comp/soft1/manual/pc/d3U3120/EU310045.HTM


戻り値用構造体の定義

<xsd:complexType name="BookResults">
<xsd:sequence>
<xsd:element name="Result" type="tns:BookResult" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="count" type="xsd:int" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="BookResult">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="writer" type="xsd:string"/>
<xsd:element minOccurs="0" maxOccurs="1" name="title" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>


BookResultが元になる構造体で、本の名前とタイトルが入ってる
その構造体の配列と、本の件数を持つ構造体gBookResults
実際はこのBookResultsを戻り値で返す

受け渡し構造体の定義

<xsd:complexType name="param">
<xsd:sequence>
<xsd:element minOccurs="0" maxOccurs="1" name="para1" type="xsd:string"/>
<xsd:element minOccurs="0" maxOccurs="1" name="para2" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>

二つの文字列が入った構造体(クラス)を引数で渡す

そいつら用の要素
<xsd:element name="param" type="tns:param"/>
<xsd:element name="BookResults" type="tns:BookResults"/>

後はmessageで

<wsdl:message name="getBookRequest">
<wsdl:part name="Resultset" element="tns:param"/>
</wsdl:message>
<wsdl:message name="getBookResponse">
<wsdl:part name="Resultset" element="tns:BookResults"/>
</wsdl:message>

こんな感じで受け渡せばいいようだった


これでWSDLもできたので、実行してみるが本のデータ値が入らない……

PHPもよくわかってないだけあって少し時間がかかった

PHPのWebサービス側での返却値は


$book = array();

$bookdata = new stdClass;
$bookdata->title = "てすと";
$bookdata->writer = "てすと2";

array_push($book,$bookdata);

$para = new stdClass;
$para->result = $book;
$para->count =3;

return $para


という風に作る
最初$bookdataをarrayで作ってどうにもダメだった。stdClassじゃないとあかんようである
もちろん引数のも構造体なので、クライアント側で構造体にパラメータ入れてやって投げること


.Netクライアント側では、WSDLのtypeで指定したBookResultなどの構造体は普通にプロキシクラスが
使えるようにしてくれるので、簡単に取れます


まずWebサービスを作るためにこの辺を参考


http://japan.internet.com/developer/20090811/26.html
http://codezine.jp/article/detail/199


とりあえずはさくっと、文字列の受け渡しレベルのWebサービスはできた。
client用のphpファイルを作って実行したら、中身も無事表示。よしよし。


だが問題はこの後

普通にPHP上で表示する分には全く問題なかったし簡単。
だが、それを.Netアプリで使おうと思ったら、えらいやたら難しかった

PHPでSOAPを使おうと思えば、PEARとPHP5から標準でついてきたSOAPがある
php.iniの設定とかインストール時のオプションがどうのこうの、という違いはあるが
どちらも使うのはそう難しくない。


PEARのSOAPにはWSDL自動生成機能がある
PHP5標準のSOAPにはない


WSDLがなくても、phpなら普通にWebサービスを使えるが、.Netだと多分WSDLがいる。
VSでWeb参照の追加、で取得する時にWSDLを指定しないと認識しないっぽい


というわけで最初はPEARのWSDL自動生成にお任せしようと思って
http://www.phppro.jp/phptips/archives/vol33/2


ここを参考に作ったが、Http://XXX ~php?wsdlのURLを.Net側でうまく認識してくれず挫折
.wsdlじゃないとダメなんだろうか?


しょうがないので、PHP5のSOAPで一通り作ってみたが、そうなるとWSDLを自力で書かなければならない

パラメータが文字列や数値などの単純なものなら問題なかったが、配列というか構造体を渡したかった
それが簡単に見えて難しかった…


WSDLの書き方に続きます