asp.net - producesresponsetype - task<iactionresult>




¿Hay alguna manera de forzar a ASP.NET Web API a que devuelva texto sin formato? (4)

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.


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





asp.net-web-api