在Azure Isolate函数中返回40x响应

ebdffaop  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(92)

我遇到了一个与this StackOverflow问题非常相似的问题。我有下面的.net 6.0隔离功能。当我在postman中调用它时,我可以看到catch语句正在执行,但响应总是200。

[Function("Enquiry")]
        public async Task<HttpResponseData> Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
        {
            try
            {
                var a = new ErrorResponseModel
                {
                    ErrorType = ErrorResponseTypeEnum.ModelValidation
                };

                a.ErrorMessages.Add("This is a test");

                throw new InvalidModelException(a);
            }
            catch (InvalidModelException inv)
            {
                
                var res = req.CreateResponse();
                res.StatusCode = HttpStatusCode.BadRequest;                
                await res.WriteAsJsonAsync(inv.ErrorResponseModel);

                return res;
            }
}

字符串


的数据
MS文档中没有任何内容建议req.CreateResponse();应该只有20x响应。我不想像上面的StackOverflow链接一样使用ActionResult,因为我在MS文档中找不到任何东西,如果ActionResult是支持的返回类型。在MS official documentation中。IActionResult对象似乎仍在预览中。
根据要求更新信息,ErrorResponseModel

[DataContract]
    public class ErrorResponseModel
    {
        [DataMember]
        [JsonConverter(typeof(StringEnumConverter))]
        public ErrorResponseTypeEnum ErrorType { get; set; }

        [DataMember]
        public List<string> ErrorMessages { get; set; }

        public ErrorResponseModel() => ErrorMessages = new List<string>();

    }

    public enum ErrorResponseTypeEnum { ModelValidation, MissingParameter, FileLocked }


InvalidModelException

public class InvalidModelException : Exception
    {
        private readonly ErrorResponseModel _errorResponseModel;

        public ErrorResponseModel ErrorResponseModel => _errorResponseModel;

        public InvalidModelException(ErrorResponseModel errorResponseModel) 
        {
            _errorResponseModel = errorResponseModel;
        }
    }

v9tzhpje

v9tzhpje1#

当你使用Write时,它会覆盖你设置的状态代码。为了在错误请求响应中提供详细信息,您需要执行以下操作:

catch (InvalidModelException inv)
        {
            var c = new
            {
                inv.Message,
                inv.StackTrace
            };
            var response = req.CreateResponse(HttpStatusCode.BadRequest);
            using var writer = new StreamWriter(response.Body, Encoding.UTF8, leaveOpen: true);
            await writer.WriteAsync(JsonSerializer.Serialize(c));
            return response;
        }

字符串
PS:你不能直接序列化InvalidModelException异常。它与NewtonSoft.Json一起工作,但与System.Text.Json一起失败

相关问题