オンプレミスで正常に動作する MVC アプリがあり、Azure Web サイトで正常に動作します。しかし、クラウド サービスとして展開すると、特定の xml ファイルにアクセスする際にアクセス拒否の問題が発生します。
これらの xml ファイルは、アプリケーション内の特定の設定を決定するのに役立つ、アプリケーションに必要なデータのほんの一部です。
アプリケーション内で必要なこれらの設定を継承できるように、これらのそれぞれが処理されるという考え方があるため、これらは階層フォルダー構造の下に多数あります。しかし、結局のところ、これらはWebルートの下のフォルダーに保存されている単なるxmlファイルであるため、それはほとんど関係ありません.
xml ファイルのビルド アクション プロパティは content に設定されているため、パブリッシュと共にデプロイされます。実際、xml ファイルが展開されていることを確認するためだけに、クラウド サービス VM に RDP を実行しました。
ただし、アプリケーションがこれらのファイルのいずれかを読み取ろうとするたびに、次のアクセス拒否エラーが発生します。
パス「E:\sitesroot\0\Templates\Applications\ControlProperties.xml」へのアクセスが拒否されました。
(注:これは、以下の回答で想定されているハードコードされたパスではありません。HttpContext.Current.Server.MapPathを使用して、Webルートに対するファイルの物理パスを決定しています)
これは、アプリケーションがファイルを読み取るためのアクセス権を持っていないことを示す標準的なアクセス拒否エラーです。
ここで、マシンに再度 RDP を実行し、この特定のファイルへのフル アクセスをすべてのユーザーに許可すると (診断のためだけに!)、アプリケーションはエラーをスローすることなく正常に動作します。したがって、これは本当にアクセスの問題であることを証明しています。
問題は、これらはプロジェクトと共に展開される単純な xml ファイルであり、展開ごとにファイルのアクセス許可を設定する必要はありません。これはちょうど間違っているでしょう。
したがって、標準的な展開の一部として、クラウド サービスがこれらの展開された xml ファイルを読み取るためのアクセス権を持たない理由を理解しようとしており、適切なソリューションに関心があります。つまり、ソリューションと共に展開されるいくつかのアクセス許可設定か、この問題に対するより良い代替アプローチがある可能性があります。
xml ファイルを読み取るために使用しているコードに関して言えば、単純に XmlSerializer を使用して、ファイルの内容を逆シリアル化してオブジェクトに戻しています。(以下のように)
public static T Deserialise(string settingsFile)
{
using (var fs = new FileStream(settingsFile, FileMode.Open))
{
var sr = new XmlSerializer(typeof (T));
var obj = (T) sr.Deserialize(fs);
fs.Close();
return obj;
}
}
Web ロール用のローカル ストレージがあることは理解しています。アプリケーションの一部としてストレージの読み取りと書き込みを行いたい場合は、これを使用しても問題ありません。ただし、基本的に、これらはアプリケーションと共にデプロイする必要がある構成設定ファイルです。