先週iPhoneからExchange Web Serviceを叩くアプリケーションを作成したくて、そのやり方を調べていました。このあたり今までほとんど勉強したことがなくよくわからないことが多かったので学んだことをメモしておきます。正直なところあまり正確で無いとおもいますし、間違いがある気がしますので、そのあたりツッコミいただけると嬉しいです。

そもそも、プログラムからWebサービスを叩く方法

私の今までの認識は「Webサービス=WebサーバーにHTTPでXMLを渡すと、XMLで答えが返ってくる」程度の認識でした。これ自体はまぁ(かなり語弊があるものの)別に間違いではないと今でも思うのですが、「じゃぁ具体的にどうやってそれをプログラムするのか?」ということはわかっていませんでした。

で、調べたところ、ベタにやり取りするのではなくて、HTTPやXMLの部分をプログラマが意識しなくてもすむようなクラス(Webサービスプロキシクラス)を使うのが普通らしいということがわかりました。難しいことはカプセル化されてしまっていて、単なるオブジェクト指向プログラミングをすればよい、と。素晴らしいですね。

このWebサービスプロキシはWSDLというWebサービス自体を定義したXMLファイルから自動生成させるのが普通の手段らしいです。

Exchange Server 2007以降のWSDLは「EWS」というディレクトリに配置されています。

  • https://<サーバー名>/EWS/Services.wsdl

上記URLにアクセスすると、実際にXMLファイルを参照できました。

iPhone用のWebサービスプロキシの自動生成ツール

WSDLファイルは入手できたので、次はこれからWebサービスプロキシを作る必要があります。.NET Frameworkにおいては、wsdl.exeを使うか、Visual StudioからWeb参照を追加することによってWebサービスプロキシを自動生成出来るらしいです。ではiPhone用には何があるのか…?ということで色々探してみました。見つかったのは以下のあたりです。

で、実際にやってみた…のですが、残念ながら正常にソースコードを生成できたのはSudzCのみ、でも、SudzCもきちんとしたソースコードは生成できなかった、というのが私の試した結果です(2010/3/5の段階)。wsdl2objcとSudzCに関しては今後の開発に期待したいところですね。残念。

ちなみにExchange Web ServiceをVisual StudioからWeb参照すると、きちんとWebサービスプロキシクラスが生成されました。このあたりは流石に同じ会社の作った製品だなぁ、とおもいました。(正直なところMSの作るWSDLがスタンダードな物では無いんじゃないのか?という気もしますが…。)

結局どうしたらいいのか

じゃぁ、結局どうしたら良いのか?というと、現時点では以下で紹介されているような方法でガリガリやらなくてはいけないっぽいです。私はもう諦めてガリガリ書こうと思ってます。

ちょっとすでにうんざりしている、というのが正直なところですけどね…。本当に皆こうやってるのかなぁ?

[work] Exchane 2007用ロールアップが適用できない

Exchange 2007用のロールアップが適用できないという相談が来てます。ネット上でほぼ情報がなかったのでログを貼り付けておきます。だれかがみつけて答えを教えてくれたらいいなぁ・・・。(夢想

[18:28:47] ************************************************
[18:28:48] * ServiceControl.ps1: 2008/09/08 18:28:48
[18:28:48] Performing service control with options: BeforePatch
[18:28:50] Setting ApplicationBase to C:\Program Files\Microsoft\Exchange Server\bin
[18:28:50] Setting AssemblyName to Microsoft.Exchange.PowerShell.Configuration, Version=8.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
[18:28:50] Setting CustomPSSnapInType to Microsoft.Exchange.Management.PowerShell.SetupPSSnapIn
[18:28:50] Setting PowerShellVersion to 1.0
[18:28:50] Setting Description to Setup Tasks for the Exchange Server (v240)
[18:28:50] Setting ModuleName to C:\Program Files\Microsoft\Exchange Server\bin\Microsoft.Exchange.PowerShell.configuration.dll
[18:28:50] Setting Version to 8.0.0.0
[18:28:50] Setting Vendor to Microsoft
[18:28:53] Saving service and registry data
[18:28:53] Saving service state to 'C:\DOCUME~1\exadmin\LOCALS~1\Temp\StoppedServices.xml'...
[18:28:54] Saving services registry data
[18:28:55] Adding to installed roles list: AdminTools
[18:28:55] Adding to installed roles list: ClientAccess
[18:28:55] Adding to installed roles list: Bridgehead
[18:28:55] Stopping services for role 'AdminTools'
[18:28:55] Stopping services for 'AdminTools'...
[18:28:55] Stopping service 'RemoteRegistry'.
[18:28:56] Error:

なんともかんとも。
それにしても、Exchange2007用のロールアッププログラムには適用プロセスに非常にたくさん問題があるようで。本家のブログも非常に盛り上がっております。

Exchange Server 200xをクラスタで構築する場合にMSDTCは必要なのかどうかというお話。いるとかいらないとか諸説あります。

まず、2000および2003に関してはExchange Team Blogにあるように

  • セットアップ時のみ必要
  • workflowがあるなら常時必要

というのが本当のところのようです。

開発チームが言っていることはさすがに信用できます。

さて、問題は最新のExchange Server 2007の場合。必要なくなったといううわさを聞いたのですが、それが本当かどうか。上記blog記事は投稿日が2005年なので、さすがにそのままExchange Server 2007にも適用できるとはおもえないので。

検索してみると以下のページが見つかります。

ここではSCCに関してはExchange Server 2003と同様にMSDTCは必要であると回答されています。しかし以下では逆に必要ないと言われています。

どちらを信用すべきかは微妙ですが、Exchangeの開発チームの人が言うことをとりあえず信用しておくことにしました。というわけで、Exchange Server 2007のクラスタにはMSDTCは必要ないのではないかと思います。

ただし、警告は出ますが・・・。心配性の人は必要なくてもいいからMSDTCもリソースとして登録しておくと夜ぐっすり眠れるでしょう。

Exchange2007でPowerShellでユーザー、メールボックスを作成してみました。特に難しいことは無かったのですが、ポイントはいかの通り。

  • コマンドの雛形はGUIで実行したあとに表示されるコマンドを利用できる
  • パスワードはSecureStringなので、平文ではかけない→SecureStringの変数を作成し、それを指定するようにする

ここのブログが参考になりました。
http://winzenz.blogspot.com/2006/08/creating-new-mailbox-using-powershell.html

いや、Exchange2007、ずいぶん便利になりましたね!