我希望现有的应用程序(我不控制)将信息发送到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发送此标头?
答案 0 :(得分:3)
该错误是预期的。函数运行时基于C#,当响应尝试添加Allow
标头时,基础C#代码将检查其名称。根据设计,Allow
是HttpContentHeaders中的只读标头,因此我们不能在HttpResponseHeaders中添加它。
有两种解决方法可供您参考。
使用自定义标头名称,例如Allow-Method
。
创建一个新的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"
]