我需要调用azure函数; fn(b),来自另一个天蓝色的函数; FN(a)中。
fn(a) - > FN(b)中
这两个功能都在同一个功能应用程序中。问题是每当我尝试拨打(b)时,我得到403-Forbidden"根级别的数据无效"。
是否可以从同一功能应用程序中的另一个azure函数调用azure函数?
功能1
public static class Function1
{
[FunctionName("Function1")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]
HttpRequestMessage req, TraceWriter log)
{
log.Info("---- C# HTTP trigger function 1 processed a request.");
UploadToF2(log);
return null;
}
private static IRestResponse UploadToF2(TraceWriter log)
{
SomeObject payload = new SomeObject();
payload.One = "One";
payload.Two = 2;
payload.Three = false;
payload.Four = 4.4;
var Fn2Url = Convert.ToString(ConfigurationManager.AppSettings["F2Url"]);
log.Info("Hitting F2 at " + Fn2Url);
var method = Method.POST;
var client = new RestClient(Fn2Url);
var body = JsonConvert.SerializeObject(payload);
var request = new RestRequest(method);
request.RequestFormat = DataFormat.Json;
request.AddHeader("Content-Type", "application/json");
request.AddBody(payload); // uses JsonSerializer
IRestResponse response = client.Execute(request);
return response;
}
}
class SomeObject
{
public string One { get; set; }
public int Two { get; set; }
public bool Three { get; set; }
public double Four { get; set; }
}
功能2
public static class Function2
{
[FunctionName("Function2")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
log.Info("---- C# HTTP trigger function 2 processed a request.");
string payload = await req.Content.ReadAsStringAsync();
log.Info("payload == "+payload);
return null;
}
}
其他信息:
authLevel
对两个函数都是匿名的当fn(a)无法调用fn(b)时,唯一的条件是这两个函数都在Azure中托管。
答案 0 :(得分:2)
从另一个调用一个azure函数时,403(禁止)
如果不在IP限制中添加客户端IP,那么您在客户端测试它将得到403错误。如果不在IP限制中添加客户端IP,不仅可以从另一个调用azure函数,还可以限制所有函数。
在您的情况下,您需要在IP限制中添加测试client Ip,然后它才能正常工作。
<强>更新强>
添加测试结果。
答案 1 :(得分:0)
使用时通过GET本地工作到Function1:
var Fn2Url = "http://localhost:7071/api/Function2";
您在配置中使用了什么价值?
答案 2 :(得分:0)
通过其完整网址调用函数#2,因为在请求进入您的功能应用之前,首先会有一个前端层被点击。即使在同一个功能应用程序中相互调用的函数也是如此。
GET https://{func-app-name}.azurewebsites.net/api/function2
如果authLevel
中的function.json
不是匿名的,请将API密钥作为?code=
传递 -
https://{func-app-name}.azurewebsites.net/api/function2?code={API-key}
或作为标题 -
GET https://{func-app-name}.azurewebsites.net/api/function2
x-functions-key: {API-key}
在本地运行时(Visual Studio / func host start
),忽略authLevel
的值。看着你的装饰者,AuthorizationLevel.Anonymous
存在,所以很可能不是它。
最重要的是,你可以做得更好,在功能#2中返回null
:200 OK
,202 Accepted
,204 No Content
,所有有效的选择取决于应该是什么接下来发生(异步/同步处理)。