iactionresult c# asynchronous asp.net-web-api

c# - iactionresult - No se puede leer Request.Content en el controlador ASP.NET WebApi



iactionresult c# (8)

  1. Request.Content.ReadAsStreamAsync (). Result.Seek (0, System.IO.SeekOrigin.Begin)
  2. nuevo System.IO.StreamReader (Request.Content.ReadAsStreamAsync (). Result) .ReadToEnd ()

Estoy escribiendo un proxy usando WebApi en un TransferMode.Streamed HttpSelfHostConfiguration exe.

Cuando uso el violín para publicarlo en mi ApiController, por alguna razón no puedo leer el Request.Content, me devuelve "" incluso si tengo datos POSTed.

public class ApiProxyController : ApiController { public Task<HttpResponseMessage> Post(string path) { return Request.Content.ReadAsStringAsync().ContinueWith(s => { var content = new StringContent(s.Result); //s.Result is "" CopyHeaders(Request.Content.Headers, content.Headers); return Proxy(path, content); }).Unwrap(); } private Task<HttpResponseMessage> Proxy(string path, HttpContent content) { ... } }

Aquí está mi solicitud web

POST http://localhost:3001/api/values HTTP/1.1 Host: localhost:3001 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Content-Type: application/json Content-Length: 26 { "text":"dfsadfsadfsadf"}

¿Que estoy haciendo mal? ¿Por qué regresa el resultado como la cadena vacía en lugar de la json en bruto?


Conseguí que esto funcionara al final al heredar de la interfaz base en lugar de ApiController. Creo que el ApiController estaba vinculando el modelo que estaba comiendo la respuesta.

editar: Lo correcto para construir un proxy es un MessageHandler, no un ApiController


Creo que tienes razón sobre el ApiController que come el Request.Content. El objeto "Solicitud" que ve en el ApiController es en realidad del tipo System.Net.Http.HttpRequestMessage. Pude solucionar este problema pero hacer una copia de seguridad del objeto System.Web.HttpRequest como este:

Dim content as string If HttpContext.Current.Request.InputStream.CanSeek Then HttpContext.Current.Request.InputStream.Seek(0, IO.SeekOrigin.Begin) End If Using reader As New System.IO.StreamReader(HttpContext.Current.Request.InputStream) content = reader.ReadToEnd() End Using

No sé si es necesario buscar el rebobinado, pero lo puse por si acaso.


Deberías usar un tipo complejo para tu argumento y luego en el cuerpo usar algo como

{ruta: "c: ..."}

Als usa el

Content-Type: application / json; charset = UTF-8

encabezado en su solicitud de publicación para que la API web sepa que json está contenido en el cuerpo


Esta firma para publicación come los datos de la publicación:

public HttpResponseMessage Post([FromBody]string postdata)

cambiarlo a:

public HttpResponseMessage Post()

entonces esta llamada funciona bien para obtener los datos de la publicación:

string str = response.Content.ReadAsStringAsync().Result;

Lo probé yo mismo. use la primera firma, str está vacía, use la segunda str tiene datos de publicación!


Intente reemplazar ReadAsStringAsync() con ReadAsAsync<string>() .


Me doy cuenta de que esto es antiguo y me han respondido, pero por lo que vale, la razón por la que no se puede usar ReadAsStringAsync() no es porque ''come los datos'' como se sugirió, sino porque el contenido se está procesando como una transmisión y dado que los datos han sido consumidos por el formateador de mensajes, la Posición de la transmisión ya está al final.

Para usar ReadAsStringAsync() , primero debe restablecer la posición del flujo de contenido al principio.

Lo hago así: response.RequestMessage.Content.ReadAsStreamAsync().Result.Seek( 0, System.IO.SeekOrigin.Begin ) porque solo tengo el HttpResponseMessage, pero si tienes acceso directo al HttpRequestMessage (como lo haces dentro del controlador) puede usar Request.Content.ReadAsStreamAsync().Result.Seek( 0, System.IO.SeekOrigin.Begin ) que es funcionalmente equivalente, supongo.


Yo también tuve problemas con esto. ReadAsStringAsync y ReadAsAsync devuelven un objeto de tarea. Al hacer referencia a la propiedad Result , se devuelve el contenido. Puede estar haciendo referencia a la propiedad Resultado hace que la solicitud de lectura asíncrona se bloquee.

Ejemplo:

string str = response.Content.ReadAsStringAsync().Result;