前回実施した、「EntityFramework6」を利用し、図形の位置から該当する大字の図形を抽出する処理をクラウド環境(IIS)で実施した際、以下のエラーが発生しました。
「’SqlServerSpatial.dll’ を読み込めません:指定されたモジュールが見つかりません」
実施した環境は以下の通りです。
開発環境 | クラウド環境 | |
---|---|---|
OS | Windows 10 | Windows Server 2016 |
DBサーバー | SQL Server 2014 Express | SQL Server 2016 |
Webサーバー | Visual Studio 2017の付属 | IIS 10 |
ロードしているdllの確認
まず最初に、開発環境とクラウド環境でロードしているdllが異なっているかを確認するため、Global.asax.csからロードしているdllを出力しました。
1 2 3 4 5 6 7 |
protected void Application_Start(object sender, EventArgs e) { foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { logger.Debug($"□{asm.FullName},file={asm.Location}"); } } |
出力結果を確認してみると、SqlServerSpatial.dllはロードされていませんでしたが、Microsoft.SqlServer.Typesがロードされており、ロード場所が異なっていました。
開発環境の方では、グローバルアセンブリキャッシュからdllがロードされており、クラウド環境ではbin直下のdllがロードされており異なるdllが利用されていました。
Microsoft.SqlServer.Typesの更新
どちらのバージョンが正しいか確認するため、Microsoft.SqlServer.Types.dllのバージョンを確認したところ、開発環境、クラウド環境ともにバージョンが10なっていました。
これは、SQL Server 2008バージョンなので、開発環境で使用しているSQL Server 2014に合わせて、Microsoft.SqlServer.Types.dllのバージョン12をnugetより取得しました。
ちなみに、SQL Server製品とバージョンの関係は以下の通りです。
製品名 | バージョン |
---|---|
SQL Server 2016 SP1 | 13.0.4001.0 |
SQL Server 2014 SP1 | 12.0.4100.1 |
SQL Server 2012 SP1 | 11.0.3000.0 |
SQL Server 2008 R2 | 10.50.1600.1 |
SqlServerSpatial120.dllの配置
ネットで色々調べた結果、’SqlServerSpatial.dll’ を読み込めませんが発生した場合、「Microsoft System CLR Types for SQL Server」をサーバーにインストールしてくださいとの回答がありました。
ただ、クラウド環境では、SQL Serverのバージョンが異なるため、インストールすると色々支障が出る恐れがあるため、とりあえず、Microsoft.SqlServer.Types.dllを取得した際に、ネイティブバイナリである、SqlServerSpatial120.dllも付属してたのでASP.netのbin配下に置きました。
新たなエラーの発生
クラウド環境でdllを入れ替えた後、ASP.NETを実行すると、新たな例外が発ししました。
1 2 3 4 |
2021-05-12 17:36:55,550 [8] ERROR System.InvalidOperationException: Spatial types and functions are not available for this provider because the assembly 'Microsoft.SqlServer.Types' version 10 or higher could not be found. 場所 System.Data.Entity.SqlServer.SqlTypesAssemblyLoader.GetSqlTypesAssembly() 場所 System.Data.Entity.SqlServer.SqlSpatialDataReader.<.cctor>b__1() 場所 System.Lazy`1.CreateValue() |
googleで翻訳すると、「アセンブリ ‘Microsoft.SqlServer.Types’バージョン10以降が見つからなかったため、このプロバイダーでは空間タイプと関数を使用できません。 」
とのこと、Microsoft.SqlServer.Types.dllのバージョンを10->12に上げたため発生したのだろうか?
パッケージのリダイレクト指定
ネットで検索すると、同様のエラー発生事例及び対策が掲載されていたので、これを参考に以下のようにweb.configで指定しているパッケージのリダイレクトを追加します。この記述により、古いバージョンは、バージョン12.0.0にリダイレクトされます。
1 2 3 4 5 6 7 8 |
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" /> <bindingRedirect oldVersion="10.0.0.0-12.0.0.0" newVersion="12.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime> |
上記の対策により、エラーが解消されました。