131

我需要从 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");
}
4

6 回答 6

241

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

    [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 数据类型/结构返回数据。

于 2012-10-23T10:04:42.423 回答
20

对于 .net 核心:

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

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

于 2017-04-04T21:30:30.650 回答
15

如果您只是在寻找一个简单的纯/文本格式化程序而不添加额外的依赖项,那么这应该可以解决问题。

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");
于 2012-10-13T07:35:25.480 回答
12
  • 请注意不要在 ASP.NET Web API 中使用上下文,否则您迟早会后悔的。ASP.NET Web API 的异步特性使得使用HttpContext.Current成为一种负担。
  • 使用纯文本格式化程序并添加到您的格式化程序。周围有几十个。你甚至可以很容易地写你的。WebApiContrib有一个。
  • 如果您已注册纯文本格式化程序,您可以通过在控制器中设置内容类型标题来强制它httpResponseMessage.Headerstext/plain
于 2012-07-20T15:19:56.087 回答
6

当 Accept: text/plain 不起作用时,则没有为 text mime 类型注册的格式化程序。

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

创建一个支持文本 mime 类型的非常简单的媒体类型格式化程序。

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

于 2012-07-20T14:53:32.673 回答
1

像下面这样的扩展可以减少行数并美化你的代码:

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


现在您可以在您的 : 中使用定义的扩展名Web API

public class HomeController : ApiController
{
    [System.Web.Http.HttpGet]
    public HttpResponseMessage Index()
    {
        return "Salam".ToHttpResponseMessage();
    }
}


通过路由{DOMAIN}/api/Home/Index可以看到以下纯文本:

MyPlainTextResponse

于 2018-01-04T22:11:33.483 回答