【问题标题】:Azure functions & HTTP OPTIONS requestAzure 函数和 HTTP OPTIONS 请求
【发布时间】: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 ?

【问题讨论】:

    标签: azure azure-functions


    【解决方案1】:

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

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

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

    2. 新建一个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 发布请求调用逻辑应用

      【讨论】:

        猜你喜欢
        • 2012-10-12
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 2021-06-11
        • 2015-06-11
        相关资源
        最近更新 更多