Azure 函数和 HTTP OPTIONS 请求

Posted

技术标签:

【中文标题】Azure 函数和 HTTP OPTIONS 请求【英文标题】:Azure functions & HTTP OPTIONS request 【发布时间】:2019-05-12 15:04:50 【问题描述】:

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

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

我遇到的问题是应用程序在来自 Azure 函数对 OPTIONS 请求的响应中需要一个标头“允许:POST,OPTIONS”。如果标头不存在,它将不会继续(相反,它会抛出错误:'POST is not allowed')

尝试在 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 ?

【问题讨论】:

【参考方案1】:

该错误是预期的。函数运行时基于 C#,当响应尝试添加 Allow 标头时,底层 C# 代码会检查其名称。根据设计,Allow 是HttpContentHeaders 中的只读标头,因此我们无法将其添加到HttpResponseHeaders 中。

这里有两个解决方法供您参考。

    使用自定义标题名称,例如Allow-Method

    新建一个Function app,默认使用Function runtime 2.0,我们可以设置Allow header。

【讨论】:

我现在有以下设置:FUNCTIONS_EXTENSION_VERSION = ~2 FUNCTIONS_WORKER_RUNTIME=node WEBSITE_NODE_DEFAULT_VERSION=10.14.1 更新后,我收到错误“错误:函数运行时无法启动。” 感谢您的提示!!!如果存在现有功能,Azure 不允许升级。创建一个新的就行了docs.microsoft.com/en-us/azure/azure-functions/… @Kermit754 你是对的,创建一个新的更安全。这些步骤对我有用,因为我只有一个功能,例如上面的示例。如果对你有帮助,你能接受我的建议吗?【参考方案2】:

如果您通过门户进行编辑,请导航到函数的 integrate 部分并选择 POST 和 OPTIONS 方法。

【讨论】:

【参考方案3】:

您是否尝试将允许的方法添加到 function.json 文件中,如 documentation 中所述?

下面的例子:

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

【讨论】:

你好,是的,我已经正确设置了这些“authLevel”:“function”,“type”:“httpTrigger”,“direction”:“in”,“name”:“req”,“方法”:[“发布”,“选项”],【参考方案4】:

通过在逻辑应用程序前面放置一个 APIM 解决了这个问题。此 APIM 仅在 OPTIONS 请求的情况下返回 200,并为后续 HTTP 发布请求调用逻辑应用

【讨论】:

以上是关于Azure 函数和 HTTP OPTIONS 请求的主要内容,如果未能解决你的问题,请参考以下文章

Azure函数HTTP触发器未取消请求

如何从 Azure 函数内部发出基于承诺的 HTTP 发布请求 (NodeJS)?

Azure函数通过http触发请求分块读取大文件

Azure Functions:获取完整的请求 URL,包括 HTTP 触发器函数中的查询字符串

Azure 代理,请求 IIS 托管 API 时出现 CORS 错误

Azure 函数实例和缩放