c# - open - asp.net core web api 2
El parĂ¡metro POST de la API de ASP.NET Core siempre es nulo (4)
El problema es que Content-Type
es application/json
, mientras que la carga útil de solicitud es en realidad de text/plain
. Eso causará un error HTTP de 415 tipo de medio no compatible.
Tiene al menos dos opciones para alinear, luego Content-Type
y el contenido real.
Use application / json
Mantenga Content-Type
como application/json
y asegúrese de que la carga útil de la solicitud sea JSON válida. Por ejemplo, haz tu solicitud de carga útil esto:
{
"cookie": "=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]"
}
Luego, la firma de acción debe aceptar un objeto con la misma forma que el objeto JSON.
public class CookieWrapper
{
public string Cookie { get; set; }
}
En lugar de la clase CookieWrapper
, o puede aceptar dinámica, o un Dictionary<string, string>
y acceder a ella como cookie["cookie"]
en el punto final
public IActionResult GetRankings([FromBody] CookieWrapper cookie)
public IActionResult GetRankings([FromBody] dynamic cookie)
public IActionResult GetRankings([FromBody] Dictionary<string, string> cookie)
Usar texto / plano
La otra alternativa es cambiar su Content-Type
a text/plain
y agregar un formateador de entrada de texto sin formato a su proyecto. Para hacer eso, crea la siguiente clase.
public class TextPlainInputFormatter : TextInputFormatter
{
public TextPlainInputFormatter()
{
SupportedMediaTypes.Add("text/plain");
SupportedEncodings.Add(UTF8EncodingWithoutBOM);
SupportedEncodings.Add(UTF16EncodingLittleEndian);
}
protected override bool CanReadType(Type type)
{
return type == typeof(string);
}
public override async Task<InputFormatterResult> ReadRequestBodyAsync(
InputFormatterContext context,
Encoding encoding)
{
string data = null;
using (var streamReader = context.ReaderFactory(
context.HttpContext.Request.Body,
encoding))
{
data = await streamReader.ReadToEndAsync();
}
return InputFormatterResult.Success(data);
}
}
Y configura Mvc para usarlo.
services.AddMvc(options =>
{
options.InputFormatters.Add(new TextPlainInputFormatter());
});
Ver también
He leído lo siguiente:
- El parámetro Asp.net Core Post siempre es nulo
- asp.net webapi 2 post parámetro siempre es nulo
- web-api POST body object siempre nulo
- Parámetro Web Api siempre nulo
Mi punto final:
[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();
}
Mi petición:
$http.post(ENDPOINTS["Validate Cookie"], cookie , {''Content-Type'': ''application/json''});
Donde cookie
es la cadena que estoy enviando desde la entrada del usuario.
La solicitud se publica en el punto final con los datos apropiados. Sin embargo, mi cadena siempre es nula. He intentado eliminar la etiqueta [FromBody]
, así como agregar un =
delante de los datos publicados sin suerte. También he intentado agregar y eliminar diferentes tipos de contenido con todas las combinaciones de los anteriores.
La razón por la que estoy haciendo esta acción específica es larga y no importa para esta pregunta.
¿Por qué mi parámetro siempre es nulo sin importar lo que parezca hacer?
Editar: También he intentado usar {cookie: cookie}
Edit2 : La solicitud:
Request URL:http://localhost:54093/getter/validatecookie
Request Method:POST
Status Code:400 Bad Request
Remote Address:[::1]:54093
Cabeceras de respuesta
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?=
Encabezados de solicitud
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
Solicitud de carga
=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]
La respuesta de Shaun Luttin funciona, pero pierde una información importante. La razón por la que no se reconoce su cadena es porque no es una cadena JSON .
Hacer esto;
var payload=JSON.stringify("=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]");
Entonces puedes dejar el controlador como está;
$.ajax({
url: http://localhost:54093/getter/validatecookie,
type: ''POST'',
contentType: ''application/json'',
data: payload
});
Es vergonzoso el tiempo que esto me llevó a averiguar. Realmente espero que ayude a alguien!
Simplemente necesita poner el cuerpo entre comillas de manera que represente una string
. También debe dejar el tipo de solicitud como application/json
. De esa manera, el formateador de tipo de medios lo resolverá:
"=sec_session_id=[redacted]; _ga=[redacted]; AWSELB=[redacted]"
Debería hacer el truco.
ridículamente, en dot net core no puede usar solo el "parámetro de cadena de cuerpo". debes hacer una clase modelo para un solo parámetro de cadena.
public async Task<IActionResult> GetRankings([FromBody] string cookie)
=>
//1. make a model. MyCookie.cs
class MyCookie{
public string Cookie { get; set; }
}
//2. edit your parameter
public async Task<IActionResult> GetRankings([FromBody] MyCookie cookie)