Есть ли способ заставить ASP.NET Web API возвращать обычный текст?

Мне нужно получить ответ обратно в текстовом виде с помощью API-интерфейса ASP.NET Web API.

Я попытался сделать запрос с Accept: text/plain, но, похоже, это не трюк. Кроме того, запрос является внешним и вне моего контроля. То, что я бы выполнил, - это подражать старому способу ASP.NET:

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

Любые идеи?

EDIT, решение: Основываясь на ответе Aliostad, я добавил текстовый форматир WebAPIContrib, инициализировал его в Application_Start:

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

и мой контроллер получил что-то вроде:

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

Ответ 1

Хммм... Я не думаю, что вам нужно создать пользовательский форматтер, чтобы сделать эту работу. Вместо этого верните содержимое следующим образом:

    [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.

Ответ 2

Если вы просто ищете простой текстовый форматированный текст без добавления дополнительных зависимостей, это должно сделать трюк.

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");

Ответ 3

  • Пожалуйста, будьте осторожны, чтобы не использовать контекст в ASP.NET Web API, или вы рано или поздно пожалеете. Асинхронный характер ASP.NET Web API позволяет использовать HttpContext.Current ответственность.
  • Используйте текстовый форматировщик и добавьте в свои форматиры. Их окружают десятки. Вы могли бы даже написать свое легко. WebApiContrib имеет один.
  • Вы можете принудительно установить его, установив заголовок типа контента на httpResponseMessage.Headers на text/plain в вашем контроллере, если вы зарегистрировали простой текстовый форматтер.

Ответ 4

Когда Accept: text/plain не работает, то для текстовых mime-типов не зарегистрирован форматтер.

Вы можете убедиться, что для указанного типа mime нет форматировщиков, получив список всех поддерживаемых форматов из конфигурации службы.

Создайте очень простой формат медиафайлов, поддерживающий типы текстового mime.

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

Ответ 6

Расширение, подобное следующему, может уменьшить количество строк и украсить ваш код:

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