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?
Several months ago, Microsoft decided to change up the HttpResponseMessage class. Before, you could simply pass a data type into the constructor, and then return the message with that data, but not anymore. Now, you need to use the Content property to set the content of the message.
To manually pass the Content-Length header, you need to add the Content-Length: [length] and Content-Type: [mime type] headers to your request, which describe the size and type of data in the body of the POST request.
HttpResponseMessage works with HTTP protocol to return the data with status/error.
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. }
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
) StringContent
will add an extra useless/problematic header: Content-Type: plain/text; charset=...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With