Azure Functions 没有 return 405 响应
Azure Function doesn't return a 405 response
当仅为 POST 定义了 HTTP 触发器,但用户尝试对相同的 URL 执行 GET 时,Azure Functions return 返回 404 而不是预期的 405 .
在这种情况下 return HTTP 状态代码 405 的最佳方法是什么? (连同所需的“允许”header)
有趣的是,APIM 目前还 returns 404 而不是 405 响应 (https://feedback.azure.com/forums/248703-api-management/suggestions/32626496)。
查了很多文档和博客,都没有找到完美的解决办法。我有一个解决方案,它看起来有点笨,但它有效。
解决方案
可以允许使用get请求,然后在Function
里面进行判断。如果是get
请求,手动指定405
状态码。
完整的示例代码如下:
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
if (req.Method == HttpMethods.Get) {
var result = new ObjectResult("your message");
result.StatusCode = StatusCodes.Status405MethodNotAllowed;
return result;
}
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
string responseMessage = string.IsNullOrEmpty(name)
? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
: $"Hello, {name}. This HTTP triggered function executed successfully.";
return new OkObjectResult(responseMessage);
}
}
预期返回的状态码:
当仅为 POST 定义了 HTTP 触发器,但用户尝试对相同的 URL 执行 GET 时,Azure Functions return 返回 404 而不是预期的 405 .
在这种情况下 return HTTP 状态代码 405 的最佳方法是什么? (连同所需的“允许”header)
有趣的是,APIM 目前还 returns 404 而不是 405 响应 (https://feedback.azure.com/forums/248703-api-management/suggestions/32626496)。
查了很多文档和博客,都没有找到完美的解决办法。我有一个解决方案,它看起来有点笨,但它有效。
解决方案
可以允许使用get请求,然后在Function
里面进行判断。如果是get
请求,手动指定405
状态码。
完整的示例代码如下:
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
if (req.Method == HttpMethods.Get) {
var result = new ObjectResult("your message");
result.StatusCode = StatusCodes.Status405MethodNotAllowed;
return result;
}
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
string responseMessage = string.IsNullOrEmpty(name)
? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
: $"Hello, {name}. This HTTP triggered function executed successfully.";
return new OkObjectResult(responseMessage);
}
}
预期返回的状态码: