ASP.Net Core为JSON内容设置Content-Type和Location标头

问题描述 投票:0回答:2

我有一个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

rest asp.net-core
2个回答
1
投票

您可以手动设置标头。直接在控制器中或在自定义IActionResult类中。

HttpContext.Response.Headers["Location"] = "...";

1
投票

您可以创建自己的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

© www.soinside.com 2019 - 2024. All rights reserved.