如何检查Azure功能是否在本地环境中运行? “RoleEnvironment”在Azure Functions中不起作用

时间:2017-07-11 05:41:09

标签: c# azure azure-functions azure-cloud-services

我在代码中有一个条件,我需要检查当前环境是否不是local.i已使用private void recordAudio() { if (memoryStream == null) memoryStream = new MemoryStream(); sourceStream = new NAudio.Wave.WaveIn(); sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(16000, 1); waveIn = new NAudio.Wave.WaveInProvider(sourceStream); waveWriter = new WaveFileWriter(new IgnoreDisposeStream(memoryStream), waveIn.WaveFormat); sourceStream.DataAvailable += new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable); buff = new BufferedWaveProvider(waveIn.WaveFormat); sourceStream.StartRecording(); mytimer.Enabled = true; } private void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e) { buff.AddSamples(e.Buffer, 0, e.BytesRecorded); Console.WriteLine("test"); } void mytimer_Tick(object sender, EventArgs e) { if (sourceStream != null) { sourceStream.StopRecording(); waveWriter.Flush(); var amazonLexClient = new AmazonLexClient(Amazon.RegionEndpoint.USEast1); var amazonPostRequest = new Amazon.Lex.Model.PostContentRequest(); var amazonPostResponse = new Amazon.Lex.Model.PostContentResponse(); amazonPostRequest.BotAlias = "voiceBot"; amazonPostRequest.BotName = "voiceBot"; amazonPostRequest.ContentType = "audio/l16; rate=16000; channels=1"; amazonPostRequest.UserId = "user"; amazonPostRequest.InputStream = memoryStream; amazonPostRequest.UserId = "test"; try { amazonPostResponse = amazonLexClient.PostContent(amazonPostRequest); Console.WriteLine("Got a response"); } catch (Exception w) { Console.WriteLine("{0} Exception caught.", e); Console.WriteLine(w.Message); } ,现在这在Azure功能中不起作用,但在云服务中有效。相同的代码也在云服务中共享,因此解决方案应该与云服务和天蓝色功能一起使用。

如何检查当前环境是否未托管/部署?

4 个答案:

答案 0 :(得分:3)

您可以使用类似于实际运行时使用的方法来确定它是否在Azure上运行: https://github.com/Azure/azure-webjobs-sdk-script/blob/efb55da/src/WebJobs.Script/Config/ScriptSettingsManager.cs#L25

在这种情况下,运行时会检查是否存在名为WEBSITE_INSTANCE_ID

的应用设置

答案 1 :(得分:2)

根据Fabio Cavalcante的回答,这是一个有效的Azure功能,可以检查当前的运行环境(本地或托管):

  super("title"); 

答案 2 :(得分:1)

我不确定依赖于一些内部实现是不是一个好主意,例如WEBSITE_INSTANCE_ID 在其他答案中给出了建议。

我刚刚使用了一种非常简单的方法,通过 local.settings.json 定义了我自己的环境变量:

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "IS_RUNNING_LOCALLY": true
  }
}

然后我就这样检查:

bool isLocal = Environment.GetEnvironmentVariable("IS_RUNNING_LOCALLY") == "true";

这是一种解决方法,但它简单直观,应该相当安全。

我尝试使用 AZURE_FUNCTIONS_ENVIRONMENT,但无法在本地文件中设置它,因为运行时抱怨它已经存在,这似乎很愚蠢,因为您可以将环境设置为“本地”,例如

附言似乎依靠例如默认环境是有风险的,因为有多个与之相关的错误,并且您不能完全保证它是文档声称的“生产”。见例如here

答案 3 :(得分:0)

您可以使用AZURE_FUNCTIONS_ENVIRONMENT环境变量,该变量是自动设置的:

Environment.GetEnvironmentVariable("AZURE_FUNCTIONS_ENVIRONMENT"); // set to "Development" locally

https://github.com/Azure/azure-functions-host/issues/4491