Функции Azure 2 - Как управлять настройками сериализации json - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу иметь возможность контролировать форматирование json при возврате результата содержимого из функции Azure (V2). Ниже приведена упрощенная версия того, что я делаю:

[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, но не могу найти способ настроить это для результатов, которые возвращаются в соответствии с примером выше.

1 Ответ

0 голосов
/ 20 марта 2019

Сегодня столкнулся с той же самой проблемой.

Как прокомментировал Джерри, JsonResult может помочь вам в этом; он поддерживает свойство StatusCode:

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

Для пользовательских заголовков моё решение немного более хакерское. Я определяю свой собственный 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));

Это работает как способ возврата IActionResult с настраиваемой сериализацией JSON, кодами состояния и заголовками, при использовании максимально возможного количества типов ASP.NET Core. Надеемся, что в будущем мы получим лучшую историю интеграции / внедрения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...