Can't set Content-Type header on HttpResponseMessage headers?

C#asp.netRestasp.net Web-Api

C# Problem Overview


I'm using the ASP.NET WebApi to create a RESTful API. I'm creating a PUT method within one of my controllers, and the code looks like this:

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;
}

When I PUT to that location with the browser via AJAX, it gives me this Exception:

> Misused header name. Make sure request headers are used with > HttpRequestMessage, response headers with HttpResponseMessage, and > content headers with HttpContent objects.

But isn't Content-Type a perfectly valid header for a response? Why am I getting this exception?

C# Solutions


Solution 1 - C#

Have a look at the HttpContentHeaders.ContentType Property:

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.
}

Solution 2 - C#

Something is missing in ASP Web API: the EmptyContent type. It will allow sending an empty body while still allowing all content-specific headers.

Put the following class somewhere in your code :

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;
    }
}

Then use it as you wish. You now have a content object for your extra headers.

response.Content = new EmptyContent();
response.Content.Headers.LastModified = file.DateUpdatedUtc;

Why use EmptyContent instead of new StringContent(string.Empty)?

  • StringContent is a heavy class that executes lots of codes (because it inherits ByteArrayContent)

    • so let's save a few nanoseconds
  • StringContent will add an extra useless/problematic header: Content-Type: plain/text; charset=...

    • so let's save a few network bytes

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJezView Question on Stackoverflow
Solution 1 - C#dtbView Answer on Stackoverflow
Solution 2 - C#SandRockView Answer on Stackoverflow