我有一个API资源,您可以在其中创建新资源。看起来像这样: -
[HttpPost("/content")]
public JsonResult PostContent([FromBody] ContentCreate content)
{
JsonResult result;
if (ModelState.IsValid) {
var newContent = _contentService.Create(content);
result = Json(newContent);
result.StatusCode = (int)HttpStatusCode.Created;
result.ContentType = ContentTypes.VENDOR_MIME_TYPE;
}
else {
var error = new ClientError(ModelState){
Code = ErrorCodes.INVALID_CONTENT,
Description = "Content is invalid"
};
result = Json(error);
result.StatusCode = (int)HttpStatusCode.BadRequest;
result.ContentType = ContentTypes.VENDOR_MIME_TYPE_ERROR;
}
return result;
}
这样可以正常工作,因为它满足了我返回201
状态的要求,并且具有Content-Type
标头的供应商特定MIME类型。但是,我想返回一个指向新创建资源位置的Location
标头。我不清楚如何将Location标头添加到响应中。我读过有关CreatedResult
的内容,它几乎看起来非常合适。但是,当我使用它时,我认为无法设置Content-Type
。
所以我的问题是如何返回带有201
状态代码的JSON,带有Location
标头和自定义Content-Type
?
您可以手动设置标头。直接在控制器中或在自定义IActionResult类中。
HttpContext.Response.Headers["Location"] = "...";
您可以创建自己的outputformatter实现,因为您想要返回Json而不是二进制数据,您可以从TextOutputFormatter
派生(使用命名空间Microsoft.AspNetCore.Mvc.Formatters
)。
在该类的构造函数中,您可以设置要返回的内容类型:SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse(ContentTypes.VENDOR_MIME_TYPE));
WriteResponseBodyAsync
接受上下文参数,您可以使用此参数访问HttpContext
,以便您可以将Location标头设置为响应,还可以设置HttpStatusCode Created(201)。
最后,通过将格式化程序添加到MVC选项中,在启动类中的ConfigureServices
方法中注册格式化程序:
services.AddMvc(options =>
{
options.OutputFormatters.Insert(0, new MyOutputFormatter());
});
如果你需要更进一步,微软的文档在这个问题上非常好:https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/custom-formatters