I have read the following:
- Asp.net Core Post parameter is always null
- asp.net webapi 2 post parameter is always null
- web-api POST body object always null
- Web Api Parameter always null
My endpoint:
[HttpPost]
[Route("/getter/validatecookie")]
public async Task<IActionResult> GetRankings([FromBody] string cookie)
{
int world = 5;
ApiGetter getter = new ApiGetter(_config, cookie);
if (!await IsValidCookie(getter, world))
{
return BadRequest("Invalid CotG Session");
}
HttpContext.Session.SetString("cotgCookie", cookie);
return Ok();
}
My request:
$http.post(ENDPOINTS["Validate Cookie"], cookie , {'Content-Type': 'application/json'});
Where cookie
is the a string I am sending from the user input.
The request posts to the endpoint with the appropriate data. However, my string is always null. I have tried removing the [FromBody]
tag, as well as adding a =
in front of the posted data with no luck. I have also tried adding and removing different content types with all combinations of the above.
The reason why I am doing this specific action is long and does not matter for this question.
Why is my parameter always null no matter what I seem to do?
Edit: I have also tried using {cookie: cookie}
Edit2: The request:
Request URL:http://localhost:54093/getter/validatecookie
Request Method:POST
Status Code:400 Bad Request
Remote Address:[::1]:54093
Response Headers
Content-Type:text/plain; charset=utf-8
Date:Mon, 23 Jan 2017 03:12:54 GMT
Server:Kestrel
Transfer-Encoding:chunked
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcVXNlcnNcRG91Z2xhc2cxNGJcRG9jdW1lbnRzXFByb2dyYW1taW5nXENvdEdcQ290RyBBcHBcc3JjXENvdEdcZ2V0dGVyXHZhbGlkYXRlY29va2ll?=
Request Headers
POST /getter/validatecookie HTTP/1.1
Host: localhost:54093
Connection: keep-alive
Content-Length: 221
Accept: application/json, text/plain, */*
Origin: http://localhost:54093
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost:54093/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Request Payload
=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]
Best Answer
The problem is that the
Content-Type
isapplication/json
, whereas the request payload is actuallytext/plain
. That will cause a 415 Unsupported Media Type HTTP error.You have at least two options to align then
Content-Type
and the actual content.Use application/json
Keep the
Content-Type
asapplication/json
and make sure the request payload is valid JSON. For instance, make your request payload this:Then the action signature needs to accept an object with the same shape as the JSON object.
Instead of the
CookieWrapper
class, or you can accept dynamic, or aDictionary<string, string>
and access it likecookie["cookie"]
in the endpointUse text/plain
The other alternative is to change your
Content-Type
totext/plain
and to add a plain text input formatter to your project. To do that, create the following class.And configure Mvc to use it.
See also
https://github.com/aspnet/Mvc/issues/5137