如何从另一个本地调用一个功能应用程序?

时间:2020-02-14 14:09:42

标签: c# azure azure-functions azure-function-app

在Visual Studio中,我已经创建了2个Azure函数应用f1f2

我已经更改了两个功能应用程序的端口。

我想从f2呼叫f1,但是遇到NotFound错误。

1 个答案:

答案 0 :(得分:1)

我尝试在同一项目和不同项目中调用one FunctionAnother Function都很好。

功能1示例:

 [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
        try
        {
            //Extract Request Param

            var content = await new StreamReader(req.Body).ReadToEndAsync();
            QnAMakerQuestion objQnAMakerQuestion = JsonConvert.DeserializeObject<QnAMakerQuestion>(content);

            //Global Variable for containing message

            dynamic validationMessage;

            // Validate param

            if (string.IsNullOrEmpty(objQnAMakerQuestion.question))
            {
                validationMessage = new OkObjectResult("Question is required!");
                return (IActionResult)validationMessage;
            }
            //Selialize Request Param
            var json = JsonConvert.SerializeObject(objQnAMakerQuestion);
            var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json");
            // Call Function 2 
            HttpClient newClient = new HttpClient();
            HttpResponseMessage responseFromAnotherFunction = await newClient.PostAsync("http://localhost:7073/api/Function2FromApp2", stringContent);
            dynamic response = "";

            if (responseFromAnotherFunction.IsSuccessStatusCode)
            {
                response = responseFromAnotherFunction.Content.ReadAsStringAsync().Result;
            }

            validationMessage = new OkObjectResult(response);
            return (IActionResult)validationMessage;
        }
        catch (Exception ex)
        {
            dynamic validationMessage = new OkObjectResult(string.Format("Something went wrong, please try agian! Reason:{0}", ex.Message));
            return (IActionResult)validationMessage;
        }
    }

功能2示例:

  [FunctionName("Function2FromApp2")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");

            try
            {
                var content = await new StreamReader(req.Body).ReadToEndAsync();
                QnAMakerQuestion objQnAMakerQuestion = JsonConvert.DeserializeObject<QnAMakerQuestion>(content);

                //Global Variable for containing message

                dynamic validationMessage;

                // Validate param

                if (string.IsNullOrEmpty(objQnAMakerQuestion.question))
                {
                    validationMessage = new OkObjectResult("Question is required!");
                    return (IActionResult)validationMessage;
                }
                validationMessage = new OkObjectResult(objQnAMakerQuestion);
                return (IActionResult)validationMessage;
            }
            catch (Exception ex)
            {

                dynamic validationMessage = new OkObjectResult(string.Format("Something went wrong, please try agian! Reason:{0}", ex.Message));
                return (IActionResult)validationMessage;
            }
        }

使用的类:

   public class QnAMakerQuestion
    {
        public string question { get; set; }

    }

注意:如果您在同一个项目中运行,则不会遇到任何问题。但是,如果您在其他项目中运行,则会遇到问题 关于港口。要解决local.settings.json文件中的问题,请替换 下面的代码:

"Host": {

    "LocalHttpPort": 7073

  }

还有Update Project Properties -> Debug to following

host start --port 7073 --pause-on-error请参见以下屏幕截图:

enter image description here

邮递员测试:

我在PostMan上调用了Function 1,将其调用Function 1称为Function 1,并调用Function 2并将响应从function 2发送到{{1} }。请参见以下屏幕截图:

enter image description here

只需即插即用,如果您还有其他问题,请告诉我。