iactionresult - ¿Hay alguna manera de forzar a ASP.NET Web API a que devuelva texto sin formato?
producesresponsetype (6)
Necesito obtener una respuesta en texto sin formato desde un controlador ASP.NET Web API.
He intentado hacer una solicitud con Accept: text/plain
pero no parece hacer el truco. Además, la solicitud es externa y está fuera de mi control. Lo que lograría es imitar la antigua forma de ASP.NET:
context.Response.ContentType = "text/plain";
context.Response.Write("some text);
¿Algunas ideas?
EDIT, solución : basado en la respuesta de Aliostad, agregué el formateador de texto WebAPIContrib , lo inicialicé en Application_Start:
config.Formatters.Add(new PlainTextFormatter());
y mi controlador terminó algo así como:
[HttpGet, HttpPost]
public HttpResponseMessage GetPlainText()
{
return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, "Test data", "text/plain");
}
Cuando Aceptar: texto / normal no funciona, entonces no hay un formateador registrado para los tipos de texto mimo.
Puede asegurarse de que no hay formateadores para el tipo de mime especificado al obtener una lista de todos los formateadores admitidos desde la configuración del servicio.
Cree un formateador de tipo de medios muy sencillo que admita tipos de texto mimo.
http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters
Hmmm ... No creo que necesites crear un formateador personalizado para que esto funcione. En su lugar, devuelve el contenido de esta manera:
[HttpGet]
public HttpResponseMessage HelloWorld()
{
string result = "Hello world! Time is: " + DateTime.Now;
var resp = new HttpResponseMessage(HttpStatusCode.OK);
resp.Content = new StringContent(result, System.Text.Encoding.UTF8, "text/plain");
return resp;
}
Esto funciona para mí sin usar un formateador personalizado.
Si desea crear explícitamente resultados y anular la negociación de contenido predeterminada basada en los encabezados Aceptar, no querrá usar Request.CreateResponse()
porque fuerza el tipo mime.
En lugar de eso explícitamente cree un nuevo HttpResponseMessage
y asigne el contenido manualmente. El ejemplo anterior usa StringContent
pero hay bastantes otras clases de contenido disponibles para devolver datos de varios tipos / estructuras de datos .NET.
Para .net core:
[HttpGet("About")]
public ContentResult About()
{
return Content("About text");
}
https://docs.microsoft.com/en-us/aspnet/core/mvc/models/formatting
Si solo está buscando un formateador sencillo de texto plano sin agregar dependencias adicionales, esto debería ser el truco.
public class TextPlainFormatter : MediaTypeFormatter
{
public TextPlainFormatter()
{
this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
}
public override bool CanWriteType(Type type)
{
return type == typeof(string);
}
public override bool CanReadType(Type type)
{
return type == typeof(string);
}
public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext)
{
return Task.Factory.StartNew(() => {
StreamWriter writer = new StreamWriter(stream);
writer.Write(value);
writer.Flush();
});
}
public override Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContentHeaders contentHeaders, IFormatterLogger formatterLogger)
{
return Task.Factory.StartNew(() => {
StreamReader reader = new StreamReader(stream);
return (object)reader.ReadToEnd();
});
}
}
No olvides agregarlo a tu configuración global de la API web.
config.Formatters.Add(new TextPlainFormatter());
Ahora puede pasar objetos de cadena a
this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");
Una extensión como la siguiente puede reducir el número de líneas y embellecer su código:
public static class CommonExtensions
{
public static HttpResponseMessage ToHttpResponseMessage(this string str)
{
var resp = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent(str, System.Text.Encoding.UTF8, "text/plain")
};
return resp;
}
}
Ahora puede consumir la extensión definida en su Web API
:
public class HomeController : ApiController
{
[System.Web.Http.HttpGet]
public HttpResponseMessage Index()
{
return "Salam".ToHttpResponseMessage();
}
}
Al enrutar {DOMAIN}/api/Home/Index
, puede ver el siguiente texto sin formato:
MyPlainTextResponse
- Tenga cuidado de no utilizar el contexto en ASP.NET Web API o tarde o temprano lo lamentará. La naturaleza asincrónica de ASP.NET Web API hace que usar
HttpContext.Current
una responsabilidad. - Use un formateador de texto plano y agréguelo a sus formateadores. Hay docenas de ellos alrededor. Incluso podrías escribir el tuyo fácilmente. WebApiContrib tiene uno.
- Puede forzarlo estableciendo el encabezado de tipo de contenido en
httpResponseMessage.Headers
entext/plain
en su controlador siempre que haya registrado el formateador de texto sin formato.