tutorial open net asp c# ajax asp.net-web-api asp.net-core

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

https://github.com/aspnet/Mvc/issues/5137

He leído lo siguiente:

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)