Azure Functions 2 - 如何控制json序列化设置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Azure Functions 2 - 如何控制json序列化设置相关的知识,希望对你有一定的参考价值。

我希望能够控制从Azure函数(V2)返回内容结果时json的格式。以下是我正在做的简化版本:

[FunctionName("CreateThing")]
public static async Task<IActionResult> CreateThingAsync([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "thing")]HttpRequest req, ILogger log)
{
    try{
        var result = await GetResultAsync(req);
        return new CreatedResult($"thing/{result.id}", result);
    }
    catch(ErrorException) {
        return new BadRequestObjectResult(e.Error);
    }
}

有没有办法控制返回结果时的格式,而不使用模型上的属性?我希望能够使用JsonSerializerSettings但我无法找到一种方法,可以根据上面的示例为返回的结果配置它。

答案

今天我自己也遇到了同样的问题。

正如杰瑞评论的那样,JsonResult可以带你到达那里;它支持StatusCode属性:

return new JsonResult(new WorkQueuedResponseMessage
{
    ...
}, Constants.CommunicationJsonSerializerSettings)
{
    StatusCode = StatusCodes.Status202Accepted,
};

对于自定义标头,我的解决方案更加hacky。我定义了自己的IActionResult,只是将标题粘贴到另一个IActionResult上:

private sealed class HeaderActionResult : IActionResult
{
    private readonly IActionResult _result;

    public HeaderActionResult(IActionResult result)
    {
        _result = result;
        HeaderDictionary = new HeaderDictionary();
        Headers = new ResponseHeaders(HeaderDictionary);
    }

    public IHeaderDictionary HeaderDictionary { get; }

    public ResponseHeaders Headers { get; }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        foreach (var header in HeaderDictionary)
            context.HttpContext.Response.Headers.Append(header.Key, header.Value);
        await _result.ExecuteResultAsync(context);
    }
}

然后我可以根据需要定义辅助方法:

public static IActionResult EnableCacheHeaders(this IActionResult response, TimeSpan time)
{
    return new HeaderActionResult(response)
    {
        Headers =
        {
            CacheControl = new CacheControlHeaderValue
            {
                Public = true,
                MaxAge = time,
            },
            Expires = DateTimeOffset.UtcNow + time,
        },
    };
}

并使用它们:

return new JsonResult(new WorkAlreadyCompletedResponseMessage
{
    ...
}, Constants.CommunicationJsonSerializerSettings).EnableCacheHeaders(TimeSpan.FromDays(1));

这是一种使用自定义JSON序列化,状态代码和标头返回IActionResult的方法,同时使用尽可能多的ASP.NET Core类型。希望将来我们能够获得更好的集成/注入故事。

以上是关于Azure Functions 2 - 如何控制json序列化设置的主要内容,如果未能解决你的问题,请参考以下文章

Azure Functions 突然找不到入口点错误

Azure Functions 2.0:如何从命令提示符启动项目并允许从其他计算机连接?

如何从 Azure 移动应用服务调用 HTTP(Azure Functions)?

Azure Functions:如何在 Azure 存储队列的绑定表达式中使用 POCO?

如何使用应用服务对 Azure Functions 应用进行身份验证/授权?

如何使用 Azure Functions 检查授权