System.InvalidOperationException & System.TypeInitializationException 来自 Infer.Net 在 ASP.Net Web API 2 在 Azure Web 角色中

System.InvalidOperationException & System.TypeInitializationException from Infer.Net in an ASP.Net Web API 2 in an Azure web role

我有一个 ASP.Net Web API 2 项目。在静态构造函数的控制器中,一个 Infer.Net 模型被​​初始化。当我在本地运行项目时,通过选择 Web 应用程序作为 Visual Studio 2013 中的启动项目或通过选择 Azure 云服务项目作为启动项目,它工作正常,静态构造函数运行并且web API 调用 return 预期值。

然而,当我将站点部署到 Azure 并尝试调用任何网络 API 控制器的方法时,它们失败了,我得到了异常 System.InvalidOperationException 并解释

An error occurred when trying to create a controller of type 'TwentyQuestionsController'. 
Make sure that the controller has a parameterless public constructor.

(确实如此。)

查看内部异常的详细信息,下一个异常是 System.TypeInitializationException

The type initializer for 'GuessingGamesWebApplication.Controllers.TwentyQuestionsController' 
threw an exception

在堆栈跟踪的更下方,我看到 System.UnauthorizedAccessException

Access to the path d:\windows\system32\inetsrv\GeneratedSource' is denied

看起来当我在本地运行项目时,Web 角色进程有足够的权限 Infer.Net 来构建和编译形成模型的本地文件,但在 Azure 中,Web 角色进程缺少这些权限。

如何将 ASP.Net Web API 2 Web 角色部署到 Azure 并具有足够的权限 Infer.Net 来构建和编译构成模型的本地文件?

(N.B。我正在通过 NuGet 使用 Infer.Net 2.6.41114.1。)

========== 编辑 ===========

查看 this answer to the question Can I write to file system on azure web site? Web 角色写入权限仅限于我的应用程序的根文件夹。因此,另一种解决方案是将 Infer.Net 配置为在那里写入,而不是在 d:\windows\system32\inetsrv\ 中写入。我如何配置 Infer.Net 来做到这一点?

知道了。我已将源文件夹路径添加到我的 Infer.Net 模型 类:

上的构造函数
public LiveDatabaseGamesEngines(string generatedSourceFolder = "MyGeneratedSourceFolder")
{
    InferenceEngine.DefaultEngine.Compiler.GeneratedSourceFolder = generatedSourceFolder;
    // rest of code...
}

然后在我的 ASP.Net Web API 2 控制器的静态构造函数中,我可以传入应用程序路径:

var generatedSourceFolderPath = HostingEnvironment.MapPath("~/MyGeneratedSourceFolder");
_GamesEngines = new LiveDatabaseGamesEngines(generatedSourceFolderPath);