Azure函数和HTTP OPTIONS请求

时间:2018-12-11 15:24:45

标签: azure azure-functions

我希望现有的应用程序(我不控制)将信息发送到Azure函数。

应用程序首先发送HTTP OPTIONS请求,然后将定期发送HTTP POST消息。

我遇到的问题是,应用程序在对OPTIONS请求的Azure函数的响应中期望标题为“ Allow:POST,OPTIONS”。如果标题不存在,它将不会继续(相反,它将引发错误:“不允许发布”)

尝试在Azure函数中设置标题时,出现以下错误消息

System.Net.Http: Misused header name. Make sure request headers are used with HttpRequestMessage, response headers with HttpResponseMessage, and content headers with HttpContent objects.

我确实为所有位置启用了CORS,并允许配置中的所有方法。

module.exports = function (context, req) 
{
    //context.log('JavaScript HTTP trigger function processed a request.');

    if (req.method == "OPTIONS") 
    {
            context.res = 
            {
                body: "",
                headers: 
                { 
                    //"Access-Control-Allow-Methods" : "POST,OPTIONS",
                    "allow" : "POST,OPTIONS"
                },
                status: 200,
            };
    }
    context.done();
}

规范说应该为405响应设置Allow标头。如果标题为空,则不允许任何操作。但是,对于根本不存在标题的情况,没有定义逻辑。

有没有一种方法可以用来响应HTTP OPTIONS发送此标头?

4 个答案:

答案 0 :(得分:3)

该错误是预期的。函数运行时基于C#,当响应尝试添加Allow标头时,基础C#代码将检查其名称。根据设计,AllowHttpContentHeaders中的只读标头,因此我们不能在HttpResponseHeaders中添加它。

有两种解决方法可供您参考。

  1. 使用自定义标头名称,例如Allow-Method

  2. 创建一个新的Function应用程序,它默认使用Function runtime 2.0,我们可以在其中设置Allow标头。

答案 1 :(得分:0)

如果您正在通过门户网站进行编辑,请导航至该功能的integrate部分,然后选择POST和OPTIONS方法。

答案 2 :(得分:0)

通过将APIM放在逻辑应用程序前面来解决此问题。如果有OPTIONS请求,此APIM只会返回200,并为随后的HTTP发布请求调用逻辑应用

答案 3 :(得分:-1)

您是否尝试过按照documentation中的说明将允许的方法添加到 function.json 文件中?

以下示例:

   "authLevel": "anonymous",
   "type": "httpTrigger",
   "direction": "in",
   "name": "req",
   "methods": [
    "post",
    "options"
   ]