无法在HttpResponseMessage头上设置Content-Type标头?

84

我正在使用ASP.NET WebApi。 我正在创建一个PUT方法在我的控制器之一中,代码如下:

public HttpResponseMessage Put(int idAssessment, int idCaseStudy, string value) 
{
    var response = Request.CreateResponse();
    
    if (!response.Headers.Contains("Content-Type")) 
        response.Headers.Add("Content-Type", "text/plain");

    response.StatusCode = HttpStatusCode.OK;
    
    return response;
}

我通过AJAX在浏览器中访问该位置时进行PUT操作,它会给我返回以下异常:

使用不当的标头名称。请确保请求标头与HttpRequestMessage一起使用,响应标头与HttpResponseMessage一起使用,以及内容标头与HttpContent对象一起使用。

但是,Content-Type 不是响应的一个合法的标头吗?为什么会出现这个异常?

2个回答

124

看一下HttpContentHeaders.ContentType属性

response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/plain");

if (response.Content == null)
{
    response.Content = new StringContent("");
    // The media type for the StringContent created defaults to text/plain.
}

1
如果响应没有内容(因此.Content为空),怎么办?我想即使没有内容,也要设置Content-Type头,否则Firefox会报“未找到元素”的错误。 - Jez
你也可以尝试设置 response.StatusCode = HttpStatusCode.NoContent 而不是添加 Content-Type 头字段。 - dtb
1
很酷,这个虚拟的 response.Content = new StringContent(""); 十分好用。不过我还在想为什么 response.Headers 会存在。 - Jez
对于那些不与“内容”相关的标题。 - dtb
5
这真是荒谬。我很高兴WebApi已经完成。MVC万岁。 - Chris Marisic
显示剩余3条评论

2

ASP Web API中缺少EmptyContent类型。它允许发送一个空的主体,同时仍然允许所有特定于内容的头。

将以下类放在您的代码中的某个位置:

最初的回答:

在ASP Web API中,缺少EmptyContent类型。该类型允许发送一个空的主体,同时仍然允许所有特定于内容的头部信息。您可以在代码中的任何位置添加以下类:

public class EmptyContent : HttpContent
{
    protected override Task SerializeToStreamAsync(Stream stream, TransportContext context)
    {
        return Task.CompletedTask;
    }
    protected override bool TryComputeLength(out long length)
    {
        length = 0L;
        return true;
    }
}

然后按照您的意愿使用它。现在您拥有了一个额外标题的内容对象。"
response.Content = new EmptyContent();
response.Content.Headers.LastModified = file.DateUpdatedUtc;

为什么要使用 EmptyContent 而不是 new StringContent(string.Empty)
  • StringContent是一个执行大量代码的重型类(因为它继承了ByteArrayContent
    • 所以,让我们节省几个纳秒
  • StringContent将添加一个额外的无用/有问题的头文件:Content-Type:plain/text; charset = ...
    • 所以,让我们节省一些网络字节
最初的回答

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接