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

标签 azure json.net azure-functions

我希望能够在从 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,但我找不到一种方法来配置它以根据上面的示例返回的结果。

最佳答案

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

正如 Jerry 评论的那样,JsonResult 可以帮助您完成大部分任务;它支持 StatusCode 属性:

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

对于自定义 header ,我的解决方案有点棘手。我定义了自己的 IActionResult,它只是将 header 粘贴到另一个 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 序列化、状态代码和 header 的 IActionResult 的方法,同时使用尽可能多的 ASP.NET Core 类型。希望将来我们能得到更好的集成/注入(inject)故事。

关于Azure Functions 2 - 如何控制 json 序列化设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53264940/

相关文章:

c# - Newtonsoft JSON.net 反序列化错误,其中 JSON 中的字段更改顺序

java - jose4j 是否自动处理 Azure 签名 key 翻转?

c# - HttpClient GetStreamAsync 和 HTTP 状态代码?

azure - 具有 PK 和 RK 范围的 Azure 表存储的共享访问签名

c# - 如何使用 C# 创建我的 json 字符串?

c# - Azure Function v2 引用了 Newtonsoft.Json 版本高于 Microsoft.NET.Sdk.Functions 的项目

azure-functions - Dotnet Core Azure Function(隔离进程)如何加载每个环境的 appsettings.json

Azure函数: Deploying to stage slot also deploys to production slot

azure - 如何使用 GitHub 的 API 将 Azure Web 应用程序中的 GitHub 操作 IP 地址列入白名单

azure - 如果管道失败 Azure Datafactory 如何停止触发器