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 发布请求 (NodeJS)?
Azure Functions:获取完整的请求 URL,包括 HTTP 触发器函数中的查询字符串