Mar*_*k W 8 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);
}
}
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以控制返回结果的格式,而无需在模型上使用属性?我希望能够使用JsonSerializerSettings,但是我无法找到一种方法来针对上面的示例返回的结果进行配置。
今天我自己也遇到了同样的问题。
正如杰瑞所说,它JsonResult可以帮助你完成大部分任务;它支持一个StatusCode属性:
return new JsonResult(new WorkQueuedResponseMessage
{
...
}, Constants.CommunicationJsonSerializerSettings)
{
StatusCode = StatusCodes.Status202Accepted,
};
Run Code Online (Sandbox Code Playgroud)
对于自定义标头,我的解决方案有点棘手。我定义了自己的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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果需要的话,我可以定义辅助方法:
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,
},
};
}
Run Code Online (Sandbox Code Playgroud)
并这样使用它们:
return new JsonResult(new WorkAlreadyCompletedResponseMessage
{
...
}, Constants.CommunicationJsonSerializerSettings).EnableCacheHeaders(TimeSpan.FromDays(1));
Run Code Online (Sandbox Code Playgroud)
这是一种返回IActionResult自定义 JSON 序列化、状态代码和标头的方法,同时使用尽可能多的 ASP.NET Core 类型。希望将来我们能得到更好的集成/注入故事。
| 归档时间: |
|
| 查看次数: |
1179 次 |
| 最近记录: |