C# Azure:code-to-pull设置在所有三种情况下都能工作:Azure网站、角色和;局部

C# Azure:code-to-pull设置在所有三种情况下都能工作:Azure网站、角色和;局部,c#,asp.net,azure,C#,Asp.net,Azure,我目前正在以三种方式测试我的ASP.NET网站: 本地调试 部署为azure网站 在Azure emulator中测试(即将部署角色) 我有一个if/else,它试图检测角色环境是否可用。它在本地运行良好,但在Azure网站环境中运行时会出现以下问题: System.IO.FileLoadException:无法加载文件或程序集 'Microsoft.WindowsAzure.ServiceRuntime,版本=2.5.0.0, 区域性=中性,PublicKeyToken=31bf3856a

我目前正在以三种方式测试我的ASP.NET网站:

  • 本地调试
  • 部署为azure网站
  • 在Azure emulator中测试(即将部署角色)
我有一个if/else,它试图检测角色环境是否可用。它在本地运行良好,但在Azure网站环境中运行时会出现以下问题:

System.IO.FileLoadException:无法加载文件或程序集 'Microsoft.WindowsAzure.ServiceRuntime,版本=2.5.0.0, 区域性=中性,PublicKeyToken=31bf3856ad364e35'或其 依赖关系。定位程序集的清单定义不正确 匹配程序集引用。(来自HRESULT的异常:0x8013100) 文件名:“Microsoft.WindowsAzure.ServiceRuntime,版本=2.5.0.0, 区域性=中性,PublicKeyToken=31bf3856ad364e35'

我的代码如下:

 if (String.IsNullOrEmpty(Environment.GetEnvironmentVariable("WEBSITE_SITE_NAME")) && Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.IsAvailable)
{
//drop item on the queue for it to be picked up by the worker role
}
else
{
//Process here
}
我把它短路了,这样RoleEnvironment代码就永远不会在网站上运行了。我附加了一个调试器来验证语句的第一部分是否返回false。但是,每当我第一次跳入包含该调用的方法时,就会发生异常

是否有人建议允许我的代码正常运行,而不管它是在azure网站上运行,还是在本地运行?我还没有做任何事情来定制网站后,它的部署

编辑:基于此线程:

不能在网站中使用程序集Microsoft.WindowsAzure.Diagnostics和Microsoft.WindowsAzure.ServiceRuntime

如果是这样的话,是否有任何方法可以帮助实现自动化,这样我就不必维护两个不同版本的代码


编辑2:我正在考虑围绕这个问题进行条件编译。不是全自动的,但可能是最好的解决方案。

根据我的经验,如果您有代码/库需要知道它们是否在云服务或Azure网站中运行,最好使用配置设置,而不是尝试检查
RoleEnvironment
是否可用。我所看到的所有解决方案要么是脆弱的,要么还需要部署额外的依赖项,这是一个麻烦

读取配置的最佳方法是使用
CloudConfigurationManager.GetSetting()
方法


从云服务配置文件(如果有的话)中读取是足够聪明的,然后会返回到
app.config
web.config

看到了吗:现在我倾向于将所有内容都保存在配置文件中,并使用
CloudConfigurationManager.GetSetting()
,它将从云服务配置(如果存在)中获取设置,否则它将返回到
app.config
/
web.config
。这非常有效。你应该将此作为答案发布。更深入地说:我在servicedefinition(“true”)和web.config(“false”)中添加了一个名为“UseRoleEnvironment”的设置。我拉那个,然后决定走哪条路。现在它可以在所有三种情况下工作!