Salesforce Connectの設定 (WCF Data Services 4.5)

Salesforce Connectとは

Salesforceから外部データに対してリアルタイムでアクセスできる機能。 データ自体をSalesforceに蓄えることなく外部オブジェクトとして操作することができる。

参考 : Salesforce Connect の概要

環境

AWS上に以下の環境を構築。

  • Webサーバ

    • WindowsServer 2008
    • IIS7.5
  • DBサーバ

データベースの準備

テーブル作成

Keyを設定した簡単なテーブルを用意。

ユーザ作成

適当なユーザを作成。

参考 : データベースのユーザーとデータベースへのログインユーザーの作成 (SQL Server Tips)

ログイン許可

  • SQL Server を右クリック > プロパティ > セキュリティ > 認証をSQL Serverも含めるモードに設定
  • ログインするユーザのデータベース接続権限を許可に設定

Webサーバの準備

IIS7.5 設定

「機能の追加」でIISを追加。 regeditを使い、今回使用するAMIに.NetFramework4.5がインストールされていることを確認する。

参考 : 方法: インストールされている .NET Framework バージョンを確認する | Microsoft Docs

WCF HTTPアクティブ化

「機能の追加」で .Net Framework 3.5.1 > WCFアクティブ化 > HTTPアクティブ化 と 非HTTPアクティブ化 を追加。

IISの機能追加後アプリケーションプールのバージョンに.Net Framework v4.0を追加する。コマンドプロンプトで以下を実行する。

C:\Users\Administrator> cd C:\Windows\Microsoft.NET\Framework\v4.0.30319   

C:\Windows\Microsoft.NET\Framework\v4.0.30319> aspnet_regiis -i

参考 : VMware Mirage 5.3 Documentation Center

アプリケーションプールの変更

アプリケーションプールが2.0になっているため、4.0に変更する。

IISマネージャー > サイト(Default Web Site等) を選択 > 右ペインの 詳細設定 > アプリケーションプール(統合) を選択して変更。

ハンドラーマッピングの設定変更

以下ハンドラーの動詞にPUTDELETEを追加する。

  • ExtensionlessUrlHandler-Integrated-4.0
  • ExtensionlessUrlHandler-ISAPI-4.0_32bit
  • ExtensionlessUrlHandler-ISAPI-4.0_64bit

f:id:dafukui:20181226110413p:plain

認証の設定変更

IIS認証を確認すると匿名認証が有効になっており匿名ユーザIDがIUSRとなっている。この箇所をアプリケーション プールIDに設定。

WCF Data Services の作成

Visual Studio 2015を使って作成した。

※2017はWCF Data Servicesのテンプレートを使用するために追加の対応が必要となる

WCF data service template missing in VS2017 - Developer Community

ADO.NETで気を付けるところ

Entity Framework 5.0 を選択しないとエラーになった。

c# - VerificationException with WCF Data Services - Stack Overflow

変更箇所

    public class TestWcfDataService : DataService< /* TODO: put your data source class name here */ >
            // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);

変更後

//------------------------------------------------------------------------------
// <copyright file="WebDataService.svc.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;

namespace PetSuppliesService
{
    public class PetSuppliesData : DataService<YourEntities>
    {
        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(DataServiceConfiguration config)
        {
            // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
            // Examples:
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
        }
    }
}

ビルドしてローカルに発行する。 出力されたすべてのファイルをIISにアップロードして .svc ファイルにアクセスできるか確認。

Salesforceの設定

Trailheadの単元の通りに設定すれば問題なし。

Salesforce Connect | Salesforce Trailhead

結果と残課題

外部データを外部オブジェクトとして認識できた。

また、外部オブジェクトの参照、作成、更新もできることを確認したが、削除が権限不足によりできなかった。 RESTの動きとして、GETPOSTはできるが、PUTDELETEができない状態。 できない理由は401 - Unauthorized: Access is denied due to invalid credentials.

余談

Visual StudioをローカルPCにインストールして作成を実施。 その際、ADO.NETクラス作成時に接続するDBはAWSのパブリックIPアドレスを指定し、DBとの通信ができることを確認した。 そのままAWS上のIISに発行したことで、IISからDBへの通信はパブリックIPアドレスをターゲットにした通信となるが、Security Groupにでは外部からの接続を許可していなかったため、DBとの通信が確率できずエラーとなっていた。 クラス作成後に.edmxファイルの中のDBのアドレスをPrivate IPに指定しなおしたところ接続できるようになった。