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


75

我正在使用ASP.NET WebApi创建RESTful API。我正在一个控制器中创建一个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放置到该位置时,它给了我这个异常:

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

但是Content-Type响应不是完全有效的标头吗?为什么会出现此异常?

Answers:


116

看看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 2012年

您也可以尝试设置response.StatusCode = HttpStatusCode.NoContent而不是添加Content-Type标头字段。
dtb

1
酷,假人response.Content = new StringContent("");工作了。我仍然想知道为什么response.Headers甚至存在。
Jez 2012年

对于不Content相关的标题。
dtb 2012年

5
这太荒谬了。我很高兴WebApi完成。MVC万岁。
克里斯·马里西奇

1

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=...
    • 所以我们节省一些网络字节
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.