その①の記事では「enterprise.wsdl」を利用した接続を行いました。
強い型付けを利用した方法なので、コーディングはすっきりしますが、ファイル生成を手動で行うなど、すこし、コーディングするまでの手間もかかりますね。
もうひとつ、「Partner WSDL」を利用した方法もありますので、この記事ではその方法を解説します。
こちらは弱い型付けを利用するので、組織固有のカスタムオブジェクトではなく、標準オブジェクトに対する操作のみでいい場合はこちらの方式の方が手順が楽です。
WSDLファイルの生成とダウンロード
管理コンソールでSalesforceにログインし、「アプリケーションの設定」⇒「開発」⇒「API」を開いてください。
「パートナー WSDL の生成」をクリックします。
すると、以下のようなxmlファイルが生成されますので、ローカルのPCに保存します。
その後、「その①」の記事と同様の手順で、プロジェクトを右クリックして、「サービス参照の追加」を選択します。
OKボタンを押すと、プロジェクトに、以下のようにサービスの参照が追加されているはずです。
コーディング
それでは、ログインとユーザ情報の取得、ログアウト処理を記述してみます。
※「logger.Debug」の部分はlog4netによるログ出力のコードなので、「Console.WriteLine」などに適宜変更してください。
log4netによるログ出力を行いたい場合は、別記事を参照してください。
最初に必要な名前空間を定義します。以下の2つは必要です。
using SFDCService.sforce; using System.ServiceModel;
「SFDCService.sforce」の部分は、自分の
<作成したプロジェクトの名前空間名>.<上記で定義したサービス参照の名前空間名>
に適宜変更してください。
private void login() { try { SoapClient sfClient = new SoapClient(); String sfLogin = "xxxxxx"; String sfPassword = "xxxxxxx"; //String sfSecurityToken = "xxx"; //LoginResult lr = sfClient.login(null, null, sfLogin, sfPassword + sfSecurityToken); LoginResult lr = sfClient.login(null, null, sfLogin, sfPassword); logger.Debug(lr.sessionId+lr.serverUrl); SoapClient sc = new SoapClient("Soap", new EndpointAddress(new Uri(lr.serverUrl))); SessionHeader sh = new SessionHeader(); sh.sessionId = lr.sessionId; GetUserInfoResult userInfo = lr.userInfo; logger.Debug("UserID: " + userInfo.userId); logger.Debug("User Full Name: " + userInfo.userFullName); logger.Debug("User Email: " + userInfo.userEmail); logger.Debug("SessionID: " + lr.sessionId); logger.Debug("Service End Point: " + lr.serverUrl); sc.logout(sh, null); logger.Debug("\nLogged out\n"); sc.Close(); sfClient.Close(); } catch (Exception e) { logger.Debug("An unexpected error has occurred: " + e.Message + "\n" + e.StackTrace); } }
以上で、OKです。コンパイルして実行すると、一連の流れが実行されるはずです。
注意
An unexpected error has occurred: UNKNOWN_EXCEPTION: Destination URL not reset. The URL returned from login must be set in the SforceService
といったエラーがでる場合は、logoutメソッドの呼ばれるSoapClientのインスタンスにきちんとServerURLがセットされていないのが原因の場合が多いです。
logout処理を呼んでいるSoapClientのインスタンスが、EndpointAddressをセットした方のものであることを確認してみてください。