合并的Azure Web角色和工作角色项目在部署时无法看到app.config文件。

6

我正在实现组合的Web/Worker角色场景,如这里所述,您只需将以下内容添加到您的工作角色:

public override void Run()
{
    // This is a sample worker implementation. Replace with your logic.
    Trace.WriteLine("WorkerRole1 entry point called", "Information");
    while (true)
    {
        Thread.Sleep(10000);
        Trace.WriteLine("Working", "Information");
    }
}

正如帖子评论中所指出的问题,这个工作进程无法读取web.config文件,因此您需要添加一个app.config文件。同时注意到,app.config文件不会自动部署。
那么我的问题是,如何配置我的项目才能使app.config文件得到部署?
我已经将app.config文件添加到我的项目中,并将构建操作设置为“内容”,并勾选了“始终复制”。
这在模拟器中运行良好,但在部署到Azure后却无效。
请注意:我注意到在模拟器中会创建一个projectname.dll.config文件,但在部署到Azure时没有。我正在使用VS2010,Windows Azure Tools 2011。
我知道有些人会建议使用.cscfg文件,但我的许多组件都从web.config/app.config文件中获取它们的设置:Elmah、瞬态故障处理客户端、诊断、电子邮件等等...
3个回答

3
请仔细阅读此博客文章,它详细解释了Windows Azure Web角色中使用完整IIS所发生的情况。
您需要做的是添加一个 WaIISHost.exe.config 文件(将其复制到输出中=总是复制),并在该文件中放置所有您需要的配置。这是因为,您的代码(RoleEntryPoint)位于WaIISHost.exe进程中,而不是your pdojectName.dll进程中。

这不适用于最新的Azure SDK。 - Miguel Angelo
最新的SDK不适用于哪些内容?是WaIISHost.exe.config文件,还是完整的IIS?另外,你说的是OsFamily 3还是2,还是两者都包括?无论如何,在提问时适用!我不明白这样的评论有什么意义... - astaykov
关于 WaIISHost.exe.config 的问题,我按照其他答案所说的去做了。我会查看我的 Azure 项目的 OsFamily,这可能是区别所在。这样的评论只是为了告诉阅读答案的人,如果解决方案不起作用,也许他/她并没有做错任何事情,可以去寻找另一个解决方案...我表达得不好...抱歉。 - Miguel Angelo

3

如果使用Azure SDK 1.8并通过Visual Studio发布Web Worker Role,我需要包含一个名为ProjectName.Dll.config的配置文件来配置我的设置。当在Windows Azure上运行时,web role不会使用app.config中的配置。而且app.config文件不会自动转换为ProjectName.Dll.config并添加到部署包的bin文件夹中,因此您必须手动创建它,并将其设置为始终复制。


请关注:http://slowcheetah.uservoice.com/forums/185106-general/suggestions/3719285-transform-config-for-windows-azure-web-roles - lnaie

2
我正在使用Azure SDK 2.0和OS Family 3,并对此感到非常困惑。因此,我创建了一个MVC 4.0网站,并使用各种答案建议的4个配置文件,它们分别是:
  • Web.config
  • App.config
  • WaIISHost.exe.config
  • [AssemblyName].dll.config
除了Web.config之外,所有文件均设置为“Copy if newer”。
在配置文件中,我编写了以下内容:
  <appSettings>
    <add key="AppSettingFile" value="[NameOfConfigFile]"/>
  </appSettings>

在WebRole.cs文件中,我有以下代码:
    public class WebRole : RoleEntryPoint
    {
        public override void Run()
        {
            string appSetting = ConfigurationManager.AppSettings["AppSettingFile"] ?? "No config file found";
            Trace.TraceInformation("Config file: " + appSetting);

            while (true)
            {
                ...
            }
        }
    }

使用4个.config文件部署时的结果为:"配置文件:App.config"。所以,App.config必须是答案,对吗?

错了!只使用Web.config和App.config部署时的结果为:"未找到配置文件"。奇怪。

使用Web.config、App.config和[AssemblyName].dll.config部署时的结果为:"配置文件:[AssemblyName].dll.config"。所以,[AssemblyName].dll.config必须是答案,对吗?

错了!只使用Web.config和[AssemblyName].dll.config部署时的结果为:"未找到配置文件"。真是令人困惑!

只使用Web.config和WaIISHost.exe.config部署时的结果为:"未找到配置文件"

使用Web.config、App.config和WaIISHost.exe.config部署时的结果为:"未找到配置文件"。真是让人难以置信!

因此,我的结论是,您需要有3或4个配置文件才能配置Web项目的Worker角色。

这显然是一个错误。我个人认为,微软的意图是从WaIISHost.exe.config更改为App.config(以与Worker Roles和.NET一般相符)。但是,只有当所有4个.config文件都存在时,才会使用App.config。

因此,目前我使用Web.config和App.config以及[AssemblyName].dll.config,并且它们完全相同。

希望在使用Azure SDK 2.x时,我们只能使用App.config和Web.config。


有人确认过这个吗?这似乎非常奇怪。你尝试在2.2 OsFamily 4上做相同的实验了吗? - Poul K. Sørensen
我也没有找到更好的解决方案。这方面有什么新消息吗? - Piedone
我尝试了这个方法,使用Azure SDK 2.2和OS Family 4,它可以正常工作。 - Ahmad
使用 Azure SDK 2.6,使用 web.config 和 [AssemblyName].dll.config 进行部署:找到 [AssemblyName].dll.config,但其内容是 web.config,而没有进行 web.release.config 转换。这真令人沮丧 :( - Jeow Li Huan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接