Сегодня столкнулся с той же самой проблемой.
Как прокомментировал Джерри, 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. Надеемся, что в будущем мы получим лучшую историю интеграции / внедрения.