Is there a way to force ASP.NET Web API to return plain text?

I need to get a response back in plain text from a ASP.NET Web API controller.

I have tried do a request with Accept: text/plain but it doesn't seem to do the trick. Besides, the request is external and out of my control. What I would accomplish is to mimic the old ASP.NET way:

context.Response.ContentType = "text/plain";
context.Response.Write("some text);

Any ideas?

EDIT, solution: Based on Aliostad's answer, I added the WebAPIContrib text formatter, initialized it in the Application_Start:

  config.Formatters.Add(new PlainTextFormatter());

and my controller ended up something like:

[HttpGet, HttpPost]
public HttpResponseMessage GetPlainText()
{
  return ControllerContext.Request.CreateResponse(HttpStatusCode.OK, "Test data", "text/plain");
}

Hmmm... I don't think you need to create a custom formatter to make this work. Instead return the content like this:

    [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;
    }

This works for me without using a custom formatter.

If you explicitly want to create output and override the default content negotiation based on Accept headers you won't want to use Request.CreateResponse() because it forces the mime type.

Instead explicitly create a new HttpResponseMessage and assign the content manually. The example above uses StringContent but there are quite a few other content classes available to return data from various .NET data types/structures.


  • Please be careful not to use context in ASP.NET Web API or you will sooner or later be sorry. Asynchronous nature of ASP.NET Web API makes using HttpContext.Current a liability.
  • Use a plain text formatter and add to your formatters. There are dozens of them around. You could even write yours easily. WebApiContrib has one.
  • You can force it by setting the content type header on httpResponseMessage.Headers to text/plain in your controller provided you have registered plain text formatter.

  • If you are just looking for a simple plain/text formatter without adding additional dependencies, this should do the trick.

    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();
            });
        }
    }
    

    Don't forget to add it to your Global web api config.

    config.Formatters.Add(new TextPlainFormatter());
    

    Now you can pass string objects to

    this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain");
    
    链接地址: http://www.djcxy.com/p/20548.html

    上一篇: 如何更改默认的ASP.NET MVC Web API媒体格式化程序?

    下一篇: 有没有办法强制ASP.NET Web API返回纯文本?