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

我需要从ASP.NET Web API控制器以纯文本格式返回响应。

我试过用Accept: text/plain做一个请求,但似乎没有办法。 此外,请求是外部的,不受我控制。 我会做的是模仿旧的ASP.NET方式:

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

有任何想法吗?

编辑,解决scheme :基于Aliostad的答案,我添加了WebAPIContrib文本格式化程序,在Application_Start中初始化它:

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

和我的控制器结束了这样的事情:

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

嗯…我不认为你需要创build一个自定义的格式化,使其工作。 而是像这样返回内容:

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

这适用于我,而不使用自定义格式化程序。

如果您明确要创build输出并覆盖基于Accept头的默认内容协商,则不会希望使用Request.CreateResponse()因为它会强制MIMEtypes。

而是显式创build一个新的HttpResponseMessage并手动分配内容。 上面的例子使用了StringContent但是还有很多其他的内容类可用来从各种.NET数据types/结构中返回数据。

  • 请注意不要在ASP.NET Web API中使用上下文,否则迟早会感到抱歉。 ASP.NET Web API的asynchronous性使得使用HttpContext.Current成为一种责任。
  • 使用纯文本格式化程序并添加到您的格式化程序。 有几十个左右。 你甚至可以轻松地写你的。 WebApiContrib有一个。
  • 您可以通过设置httpResponseMessage.Headers上的内容types标题为您的控制器中的text/plain ,只要您已注册纯文本格式化程序。

如果你只是寻找一个简单的普通/文本格式化程序而不添加额外的依赖关系,这应该做的伎俩。

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

不要忘记将其添加到您的全球networkingAPIconfiguration。

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

现在你可以传递string对象了

 this.Request.CreateResponse(HttpStatusCode.OK, "some text", "text/plain"); 

当接受:text / plain不起作用,那么没有注册的格式化文本MIMEtypes。

您可以通过从服务configuration中获取所有支持的格式化程序列表来确保没有指定MIMEtypes的格式化程序。

创build一个支持文本MIMEtypes的非常直接的媒体types格式化程序。

http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters

对于.net核心:

 [HttpGet("About")] public ContentResult About() { return Content("About text"); } 

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/formatting