SalesforceにWebサービス経由でアクセスする方法(.NET編 その①)

バッチプログラムやクライアントアプリからSalesforceにログインして情報を登録・更新・取得したり、別なサイトから同じようなことを行うにはいくつか方法があります。

今回はその中で、.NETを使って、Webサービス経由で行う方法について解説したいと思います。

開発環境はVisualStudio2010、言語はC#を利用しましたが、VB.NETでもほとんど同じ手順でOKです。

プロジェクトを作成する。

まず最初に簡単なプロジェクトを作成するところから始めます。

解説にはASP.NETを使いますが、クライアントのプロジェクトでも構いません。

プロジェクト名は「SFDCService」としました。

WSDLファイルの生成とダウンロード

次にやるのは、SalesForceの組織から、Webサービス経由で接続するためのメソッドやオブジェクト情報の記述された「.wsdl」ファイルをダウンロードしてくることです。

VisualStudioは、「.wsdl」ファイルに記述された組織情報をもとに、接続や更新等を行うためのクラスを自動生成しますので、それをプログラミングに利用することができます。

管理コンソールでSalesforceにログインし、「アプリケーションの設定」⇒「開発」⇒「API」を開いてください。以下のような設定画面になるはずです。

外部からWebサービスで接続するための情報を生成するには「Enterprise WSDL」と「Partner WSDL」の2つが利用できますが、ここでは「Enterprise WSDL の生成」をクリックします。

※「Enterprise WSDL」の方が強い型付け情報が生成されます。その組織特有の型付けなので、ある組織に特化されますが、プログラミングは容易です。

逆に「Partner WSDL」は弱い型付け情報が生成されます。複数の組織に対する接続にも利用可能なゆるい型付け情報が生成されます。ただし、プログラミングで型の定義をハンドリングしなければならないため、コードが複雑になりがちです。(カスタムオブジェクトを使用しないシンプルな操作の場合はむしろこちらの方が簡単です。)

「Partner WSDL」を使用したコード例は別記事を参照ください。

「Generate」ボタンを押して、wsdlを生成しましょう。生成されるwsdlの実体はXMLで記述された型付け情報です。

FireFoxならこうなるので、右クリックして「名前を付けてページを保存」します。

保存したファイルの名称が「enterprise.wsdl」でなければ、リネームしておきましょう。

「enterprise.wsdl」からWebサービス用参照の生成

それでは次に、ダウンロードした「enterprise.wsdl」を元に、Webサービス用の定義情報を生成してみましょう。

プロジェクトを右クリックして、「サービス参照の追加」を選択します。

すると、以下のような「サービス参照の追加」ダイアログが開きますので、以下の情報を入力します。

アドレス・・・「enterprise.wsdl」の場所

名前空間・・・参照名です。お好きな名前で構いません。私は「sforce」としました。

OKボタンを押すと、プロジェクトに、以下のようにサービスの参照が追加されているはずです。

コーディング

それでは、ログインとユーザ情報の取得、ログアウト処理を記述してみます。

※「logger.Debug」の部分はlog4netによるログ出力のコードなので、「Console.WriteLine」などに適宜変更してください。

private void login()
{
 
    string username = "xxxxxxxx";
    string password = "xxxxxxx";
    //String securityToken = "xxxxx";
 
    // Create a service object
 
    binding = new SforceService();
 
    LoginResult lr;
    try
    {
        logger.Debug("nLogging in...n");
        lr = binding.login(username, password);
        //lr = binding.login(username, password + securityToken);
 
 
        String authEndPoint = binding.Url;
        binding.Url = lr.serverUrl;
 
        binding.SessionHeaderValue = new SessionHeader();
        binding.SessionHeaderValue.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);
 
        binding.logout();
        logger.Debug("nLogged outn");
 
    }
    catch (SoapException e)
    {
        logger.Debug("An unexpected error has occurred: " +
                                   e.Message + "n" + e.StackTrace);
    }
 
}
注意1

SforceServiceクラスが見つからないエラーが出る場合には、以下の手順で、enterprise.wsdlからSforceServiceクラスを生成します。

スタートメニューからVisualStudioコマンドプロンプトを開き、

wsdl /language:CS /out:enterprise.cs enterprise.wsdl

を実行します。

これで、enterprise.csが生成されますので、このファイルをプロジェクトに追加してください。

以上で、OKです。コンパイルして実行すると、一連の流れが実行されるはずです。

注意2

ログインIPの制限を行っている場合に、信頼済みネットワーク以外のIPから接続するには、パスフレーズが必要になります。上記サンプルコードでコメントアウトしている部分です。

詳しくは記事「セキュリティトークンのリセットとパスフレーズの設定について」をご参照ください。