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

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

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

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

有任何想法吗?

编辑,解决方案:基于Aliostad的回答,我添加了WebAPIContrib文本格式化程序,并将其初始化为Application_Start:

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

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

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

嗯......我不认为你需要创建一个自定义格式化程序来完成这项工作。 而是像这样返回内容:

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

这适用于我而不使用自定义格式器。

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

而应明确创建一个新的HttpResponseMessage并手动分配内容。 上面的例子使用了StringContent但还有很多其他的内容类可用于从各种.NET数据类型/结构中返回数据。


  • 请注意不要在ASP.NET Web API中使用上下文,否则迟早会感到抱歉。 ASP.NET Web API的异步特性使得使用HttpContext.Current成为一种责任。
  • 使用纯文本格式化程序并添加到您的格式化程序中。 其中有几十个。 你甚至可以轻松地写你的。 WebApiContrib有一个。
  • 您可以通过设置httpResponseMessage.Headers上的内容类型标题为您的控制器中的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();
            });
        }
    }
    

    不要忘记将其添加到您的Global web api配置中。

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

    现在你可以传递字符串对象

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

    上一篇: Is there a way to force ASP.NET Web API to return plain text?

    下一篇: Returning http status code from Web Api controller