2012年2月22日水曜日

WCFサービスを作成する

WCFサービスの作成から動作確認までの手順。ものすごい手間取った・・・
※ASP.NETサイト上で作成することを想定しています。

0.サービスの違い
サービスをつくろうかな、と思うとなんだか同じような名前でいろいろ選択肢があって迷う。
①Webサービス
②WCFサービス
③WCFデータサービス

Webサービスは一般的なSOAP形式のサービスを作成できる。単体で作成、テストが出来るので使いやすい。

WCFサービスは位置づけとしてWebサービスをさらに発展させたものであり、こちらを使った方がいいとマイクロソフトは言っているように思える。ただ、クライアントとサービスでプロジェクトを分けることが前提に作られているようで、気軽に今のWebサイト内に追加、という感じでは使いにくい。

WCFデータサービスは、エンティティデータモデルを外部公開(OData形式)するということを意識して作られているようだ。そのため、WCFサービスより柔軟性は低いが、既にエンティティデータモデルを使用しているならすばやいデータ公開が可能と思う。


1.WCFサービスの作成
新しい項目の追加 > WCFサービスで追加を行う。
こうすると、以下3種類のファイルが作成される
  >AppCode内
①I<入力したサービス名> : サービスの定義が記載されている(ServiceContract)
②<入力したサービス名>  : サービスの実装クラス

  >ルートフォルダ内(右クリックしたフォルダ内)
③<入力したサービス名>.svc : サービスのアクセスポイントとなるファイル

実態としては、③→①→②の順に処理が解決されていくイメージとなる

2.各種設定
①サービスコントラクト
外部からアクセスする処理(つまりメソッド)を定義するが、この際設定すべきアトリビュートがいくつかある。
必須:<OperationContract()>
            サービス用のメソッドであることの宣言?
任意:<WebGet()>/<WebInvoke()>
GETで使用する場合WebGet、POSTで使用する場合WebInvokeを指定する。クライアントの呼び出しとサーバー上の設定が合っていないと405 Method Not Allowedが発生することがある。
JSON以外を使用する場合は、RequestFormat/ResponseFormatで形式を設定すること。


②サービス実装
サービスの実装。ASP.NETでも稼動させる場合?クラスにAspNetCompatibilityRequirementsの指定が必要。


③web.config
system.serviceModelの部分がWCFサービスのホスティングに関わる箇所になる。
services、behaviorsはデフォルトで追加されるし内容もそれほど分かりにくくないが、注意すべきはbehaviorsの中のendpointBehaviorsだ。これを設定しないとクライアントから呼び出せない。
serviceにはbehaviors/serviceBehaviorsが対応し、
serviceのendpointにはendpointBehaviorsが対応する。
endpointBehaviorsのbehaviorにenableWebScriptかwebHttpを設定しておくことでクライアントから呼び出すことができるようになる。

endpointBehaviorsとwebHttpはどちらを設定しても一見同じに見えるが、endpointBehaviorsの場合受け取ったオブジェクト.d(例:msg.d)の中にデータが格納されるという違いがある(webHttpはそのまんま)。


3.テスト・呼び出し
サービス側のテストは、デバッガを起動すると「指定された値は無効なコントロール文字を含んでいます。」というエラーが出てどうにもうまくいかない。
ただ、幸いにしてサービスの実装は単なるクラスなので、これをコードビハインドでテストしたほうがよっぽど早い。

クライアント側は、AJAX呼び出しを行い動作の確認を行う上記の設定を行えばJQueryの$.ajaxから呼び出せるはずなので、それで動作を確認すればよい。


4.参考サイト
WCFサービスの作成方法
10 行でズバリ !! サービスの作成 (WCF) 
RESTでJSONなサービスをWCFで作ったり使ったりする

JQueryからの呼び出し
jQueryを使ってWCFのサービスにアクセス

2012年2月15日水曜日

VisualStudioからSqlServerへ接続する

開発機のクライアントにVisualStudioが入っており、DBサーバーにSQLServerが入っている、という環境でクライアントのVisualStudioからDBサーバー上のSQLServerデータベースへ接続する方法をまとめました。

・準備
・DBサーバーにpingが通るか確認する。
例えばDBサーバーが「DBSERVER01」であった場合そこにpingを打って通るかどうか確認しておく
・サービスが開始しているか確認する。
DBサーバー上でSQLServerのサービスが稼動しているか確認する

・サーバー側設定
①SqlServer構成の設定
SqlServer Configuration Manager(SqlServerxxxx > 構成ツールから起動)を起動し、SqlServerネットワークの構成 > (インスタンス名)のプロトコルで、TCP/IPが無効になっていれば有効にする(※なお、後述するが名前付きパイプはこの時点では無効にしておいたほうがいい)。
この際、TCP/IPで右クリック>プロパティから、IPAllのセクションでTCPポート1433を設定しておく。

運がよければこれだけで接続可能になる。VisualStudioのサーバーエクスプローラーから、サーバー名、ユーザー/パスワード、データベース名を指定し、テスト接続でOKが出ればとりあえず安心(サーバー側は・・・)

②WindowsFireWallの設定解除
うまくいかない場合、WindowsFireWallの設定を見る。有効になっている場合、SqlServer用のポート1433を開ける必要がある。
Windowsファイアウォールから例外のタブへ行き、ポートの追加から1433を登録する(名前は何でも良い)。追加した名前にチェックを入れ、再度トライ。
(可能なら再起動したほうが良いかもしれない)

③SQL Server Browserを起動する(別名の設定を使用している場合に必要?)
いろいろなサイトで起動させるべきと書いてあるが、必要なかった(2008R2では少なくとも)。そのものの内容を見ると、別名を使用している場合に必要なのではないか。。。という気がする。
名前付きパイプの設定を有効にする場合、セットで有効化するとよいと思われる(未検証)。ただ、この場合別名でアクセスしないとエラーになるので注意。

④データベースがリモートアクセス可能になっているか確認する
デフォルトチェックが入っているので、ここがオフになっていることは余りないが、、、
サーバーのプロパティ>接続から「このサーバーへのリモートアクセスを許可する」にチェックが入っていることを確認する。


・クライアント側設定
基本的にサーバー側に接続できたらOKなことが多いが、ここでもヤマがあることがある。
Oracleなど他DBサーバー同様、クライアント用の設定がクライアントにインストールされている必要があるのだ。
具体的には下記参照。

Microsoft.SqlServer.Management.Sdk.Sfcエラー

なお、ダウンロード先のFeature Packのサイトは一見いつもの「ダウンロード」を押しても何もインストールされない(テキストだがhtmのようなファイルが落ちてくる)。ナメとんのか、という気持ちを抑えて下のほうに行くと各種パッケージをダウンロードできるようになっているのでご注意を。

必要なのは下記モジュール。SQLServer以外のものもしこたまあって検索するのが激しく面倒だが、以下テキストは実際のサイトの語尾から取ったので検索に使えると思う。


・Native Client
・SQL Server システム CLR 型
・共有管理オブジェクト


これで晴れてVisualStudioからアクセスできるようになったはずだ。

SqlServer データベースを作成する

SqlServerはインストールできた。で、その後データベースを作成するには・・・?の手順をまとめました。

・前提
以下の要件を満たすデータベースを作成します。
・データベース名はSQLTEST
・このデータベースへのアクセスに使用するユーザーはsql
・スキーマもsqlとする(sql.testtableといったようにオブジェクトを管理する)

・作成
①データベースを作成する
システム管理者権限(saユーザー)でデータベースSQLTESTを作成します。
これは新しいデータベースの作成で難なく可能

②ログインを作成する
セキュリティ>ログインから、データベースアクセス用ユーザーsqlを作成する。

③スキーマを作成する
データベースSQLTESTで、セキュリティ>スキーマからスキーマsqlを作成する。
※SQLServerでは、Oracleと異なりユーザーとスキーマはイコールではないので別々に作る必要がある(これが良いか悪いかは・・・)

④ユーザーを作成する
データベースSQLTESTで、セキュリティ>ユーザーからユーザーsqlを作成する。
ここで、規定のスキーマに③で作成したスキーマを指定、ユーザーが所有するスキーマで③で作成したスキーマにチェック
※SQLServerでは、ログイン(認証情報)とデータベースユーザーは別なのだ。

⑤ユーザーに権限を付与する
①で作成したデータベース(SQLTEST)で右クリック、データベースのプロパティ>権限を選択し必要な権限を割り当てる。

⑥ログインの設定の見直し
ログインは、作ったままだと既定のユーザー/スキーマがdboになっている(ログインのプロパティ、ユーザーマッピングで確認)。
ここで、④で作成したユーザー(sql)を設定しておく。


以上で終了となる。なお、ここで作成したユーザーsqlはシステム管理者/データベース所有者ではないため、このユーザーでテーブルなどを作る時逐一メッセージが出る(権限を持っているかは関係ない)。

実際はsaユーザーでテーブルを作ればよいのだが、テーブルなどのオブジェクト作成もsqlで行う場合このメッセージはかなり邪魔になる。
そのため、こうした場合はsqlユーザーのデータベースロールのメンバーシップでdbownerを割り当てる(ただ、セキュリティ上言うまでもなくよろしくないので、この場合はデータベース開発用に使用するユーザーsqlに加え、システム側から使うselect用ユーザー(sqlselect)などを作成した方が良いだろう)

2012年2月8日水曜日

.NET開発 SAPとの接続(SAP .NET Connector 3.0)

.NETの開発で、SAPとの連携について検証を行ったためそれをまとめます。

・コネクタ用意
SAP接続用のコネクタをダウンロードする(ダウンロードには登録が必要)。
SAP Service Market Placeからダウンロード。32bit版と64bit版があるので注意。


特徴として、SAP GUI(具体的にはlibrfc.dll)への依存がなくなっていることと、SAP側のファンクションとの同期が不要になっている。

・開発準備
・共通
これはSAPコネクタに限ったことではない(よう?)だが、configファイルを記述する際、configSectionsが先頭にこないとビルド時にエラーになる(WPFで確認)。この点に注意。
開発に当たっては、通常のdll同様参照を通しておく(なぜかlibicudecnumber.dllにだけ参照が通らないが、特に不都合はない)。

・クライアントアプリ開発(VB.NET、WPFなど)の場合の注意点
ターゲットのフレームワークにClient Profile版(※)を設定してはならない(デフォルトClientProfileなので注意)。これは、SAPコネクタ(sapnco)でSystem.Webに依存している部分があり、これがClientProfile版にはないためである。

コンパイル > 詳細コンパイルオプション > 対象のフレームワークで確認する。

※Client Profileとは、.NET Frameworkのライト版である。.NET Frameworkは重くてインストールに失敗しやすくてこれインストールしないとアプリは使えません、となると非常にやるせない気持ちになってしまう。これを解消するために、大体の必須機能が入ったライト版があり、それがClient Profileである。

・Web開発(ASP.NET)の場合
まず、Webサーバーに「Microsoft Visual C++ 2010 再頒布可能パッケージ」が入っているか確認しよう(というか、普通入っていない)。これがないと、参照を通してBinフォルダに入れているにもかかわらずrscp4n.dllが見つかりませんというエラーが出る。

それと、前述の通りSAPコネクタには32bit版と64bit版があるため、サーバーが64bitの場合は注意が必要。

・開発
準備の道のりに比べたらたやすいものである。
サンプルのファイル(StepByStepClient)に丁寧にコードが書いてるので、それを元に開発すればすぐにできる。
注意点としては、SAP側でRFC呼び出し可能として登録されている汎用モジュールしか呼び出せない点である(クラスのメソッドなどは不可、IDocにも非対応)。
具体的には、SAP上のテーブルTFDIRで更新モードが「R」になっているものが呼び出し可能。

なお、ここまで書いておいて難だが、今後のSAPとの連携の流れとしてはWebサービスが主流になる。そのため、SAP側がWebサービスに対応している(6.0以降、具体的にはNetWeaverならOK?)なら、そちらで連携した方がコネクタいらずで簡単である。
最近ではSAP NetWeaver GatewayというRESTライクな形式でのアクセスを可能にするコンポーネントも出ている。そのため、理解ある環境ならこの流れに乗った方がいい(Webサービスを使いたい→その為の作業工数は、カネはどこから出るんだね→orz ということも多いので、その場合は本記事を参照されたし)。



参考

 特にC++ランタイムへの依存の発見はスーパープレイだと思う。Eric Laschingerさんは本当にすごい人だ。