Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Действия контроллера ASP.Net Core создают тип содержимого text/plain для простых строк.

Автор вопроса: Medeni BaykalОтветов: 2

У меня есть следующий контроллер и действие.

[Route("/api/simple")]
public class SimpleController : Controller
{
    [HttpGet]
    [Route("test")]
    public string Test()
    {
        return "test";
    }
}

Когда я вызываю его, я ожидаю, что действие вернет "test" (что является допустимым JSON), но вместо этого оно возвращает test (без кавычек). Это допустимое поведение или ошибка? Я что-то пропустил?

GET http://localhost:5793/api/simple/test HTTP/1.1
User-Agent: Fiddler
Host: localhost:5793
Accept: application/json


HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Sun, 09 Aug 2015 14:37:45 GMT
Content-Length: 4

test

Примечание. Для ASP.NET Core 2.0+ это не применяется, если в запросе присутствует заголовок Accept, но по-прежнему применяется, если заголовок accept опущен и происходит согласование содержимого.

  • Это правильное поведение, если вы действительно хотите, чтобы он возвращал кавычки, используйте управляющую последовательность: return \Test\; Bryan Mudge 09.08.2015
  • @BryanMudge Но я ожидаю вывод json. "тест" не является допустимым JSON, например, если я возвращаю объект, он сериализует объект. Medeni Baykal 09.08.2015
  • Проверьте: stackoverflow.com/questions/7070759/ Bryan Mudge 09.08.2015
  • Проблема в двойной сериализации объекта. Но в этом случае он вообще не сериализуется. Medeni Baykal 09.08.2015

Ответы

Ответ 1 · рейтинг 10 · leopignataro

Как указал @mbudnik, виновником здесь является StringOutputFormatter, который каким-то образом выбирается для форматирования вывода вместо JsonOutputFormatter. Однако его фрагмент кода больше не работает, потому что с тех пор в ASP.NET Core произошли некоторые изменения. Используйте это вместо этого:

using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Mvc.Formatters;

public class Startup {

    // ...

    public void ConfigureServices(IServiceCollection services) {
        // Add MVC, altering the default output formatters so that JsonOutputFormatter is preferred over StringOutputFormatter
        services.AddMvc(options => {
            var stringFormatter = options.OutputFormatters.OfType<StringOutputFormatter>().FirstOrDefault();
            if (stringFormatter != null) {
                options.OutputFormatters.Remove(stringFormatter);
                options.OutputFormatters.Add(stringFormatter);
            }
        });
    }

    // ...

}

Или, если вы считаете, что StringOutputFormatter вам вообще не нужен, вы можете полностью его удалить:

services.AddMvc(options => {
    options.OutputFormatters.RemoveType<StringOutputFormatter>();
});

IMO, это следует считать ошибкой, поскольку вы запросили ответ JSON (Accept: application/json), а возврат строки без кавычек определенно не JSON. Однако официальная позиция такова, что это ожидаемо.

Ответ 2 · рейтинг 3 · mbudnik

Кажется, что StringOutputFormatter мешает вам. Если вы удалите его или переместите после JsonOutputFormatter, вы получите желаемые результаты.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы