ASP.NET MVC lee datos de publicación JSON sin procesar
asp.net-mvc jsonfx (3)
Esto me está volviendo loca. Estoy usando ASP.NET MVC. Tengo un controlador con una acción HttpPost que actúa como una URL de devolución de llamada a la que llama otro servidor (que no está bajo mi control). Quiero leer JSON publicado dinámicamente sin usar WebAPI o Model Binding. La URL también tiene un parámetro de cadena de consulta pasado.
La URL de devolución de llamada se ve algo así:
http://domain.com/callback?secret=1234
He intentado leer la entrada publicada utilizando:
[HttpPost]
public ActionResult Callback( String secret )
{
String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();
// ...
}
Sin embargo, "jsonData" siempre es nulo o está vacío.
Solo quiero obtener la entrada publicada y pegarla en JsonFx para poder acceder dinámicamente a los contenidos. ¿Alguna idea sobre cómo hacer esto de la manera más fácil posible?
ACTUALIZAR
He descubierto lo siguiente ...
Mientras que lo anterior NO funciona (jsonData será nulo o vacío), lo siguiente sí lo hago si configuro las pequeñas opciones que tengo en el servidor de llamadas para omitir el parámetro de cadena de consulta "secreto", que es casi todo lo que puedo hacer en Ese fin ya que no es mi servidor. En este caso, jsonData tendrá la cadena JSON publicada correcta:
[HttpPost]
public ActionResult Callback( /* String secret */ )
{
String jsonData = new StreamReader(this.Request.InputStream).ReadToEnd();
// ...
}
Es una tarea muy frustrante y no conozco una manera fácil de aceptar tanto una cadena de consulta como datos JSON publicados en un controlador MVC estándar.
Tengo un "controlador de devolución de llamada" con métodos de acción que aceptan diversos datos (a través de GET, a través del formulario POST, a través de JSON POST, a través de JSON POST con una cadena de consulta, etc.) de diferentes servidores de terceros. Se trata de devoluciones de llamada de tipo comerciante donde no tengo control sobre los formatos o métodos utilizados para transmitir información. Solo necesito aceptar las devoluciones de llamada y procesar la información que debería estar allí.
Todo funciona bien en mi controlador, excepto en el caso de "JSON POST w / a Query String".
Esto parece (al menos para mí) ser un defecto en los controladores MVC de ASP.NET estándar. ???
¿Alguien puede sugerir una solución a esto que se pueda usar en un controlador MVC ASP.NET estándar?
Para ASP.NET Core 2, esto funciona para mí.
[HttpPost]
public ActionResult RawTest() {
using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
{
string content = reader.ReadToEndAsync().Result;
//...
}
//...
}
Restablecer la position
a Zero
antes de leer la secuencia. Request.InputStream.Position = 0
Su enfoque inicial debería funcionar si tiene en cuenta el hecho de que el enlace del modelo MVC de ASP.NET ya ha leído la secuencia, por lo que debe rebobinarlo:
[HttpPost]
public ActionResult Callback(string secret)
{
Request.InputStream.Seek(0, SeekOrigin.Begin);
string jsonData = new StreamReader(Request.InputStream).ReadToEnd();
// ...
}