先日、あるリージョン(海外)に配置していた Webサイト+SQLデータベース+BLOB を国内のリージョンにマイグレーションした際にはまったエラーについて、簡単に整理しておきたいと思います。
なにげに国内(西日本)のAzure上に、Webサイトおよびその関連データをマイグレーションした時のことです。
プログラムの中身については名称の他 特にいじってはいなかったのですが、動作テストすると ASP.NET Web API として実装したデータアクセスの Webサービス機能の一部において、次のようなエラーが出てうまくデータを端末側に送れない状況になってしまいました。
「
Web API Azure An error has occurred.」
いろいろと調べると、Web API 上のメソッドではちゃんと目的のデータは取得できており、Web API から端末側に送信する時に、内部的になんらかのエラーとなっている様子でした。
なかなか原因が掴めず、いろいろと参考になりそうな情報をあさっていると、次のようなページを見つけました。
「
Entity Framework 6 と SQL Azure をうまく使う、たったひとつの冴えたやりかた 」(「しばやん雑記」より)
もしやと思い、そこに書かれてあるコードを実装してみると、問題なく機能するようになりました。
「SQL Azure を使ったサービスを作る時にはリトライ処理を追加しておくのは、もはや常識と言っても過言ではない...」と、言うことらしいです。
このクラスをプロジェクトに追加しておくことで、Entity Framework 6 が実行時に自動的に読み込んでくれるので、SQL の実行に使うストラテジクラスを SqlAzureExecutionStrategy に切り替えることが出来るということのようです。
私は、...Configuration.cs ファイルに該当クラスを、次のように組み込んでみました。
using System.Data.Entity;
using System.Data.Entity.SqlServer;
namespace YccDemoHomePageWebApi
{
// SQL Azure を使ったサービスにおけるリトライ処理を追加
public class YccDemoDbConfiguration : DbConfiguration
{
public YccDemoDbConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
}
}
}
今後、Azure の SQLデータベースを Entity Framework 6 で扱う場合は、上記のコードを組み込むことを忘れないようにしたいと思います。
しかし、なぜ、海外にデプロイした Web API ではエラーは起きなかったのだろうか???(疑問が残ります。)