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

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

[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 опущен и происходит согласование содержимого.


person Medeni Baykal    schedule 09.08.2015    source источник
comment
Это правильное поведение, если вы действительно хотите, чтобы он возвращал кавычки, используйте управляющую последовательность: return \Test\;   -  person Bryan Mudge    schedule 09.08.2015
comment
@BryanMudge Но я ожидаю вывод json. «тест» не является допустимым JSON, например, если я возвращаю объект, он сериализует объект.   -  person Medeni Baykal    schedule 09.08.2015
comment
Проблема в двойной сериализации объекта. Но в этом случае он вообще не сериализуется.   -  person Medeni Baykal    schedule 09.08.2015


Ответы (2)


Как указал @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. Однако официальная позиция такова, что это ожидаемо.

person leopignataro    schedule 13.02.2017

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

Форматизаторы вывода

person mbudnik    schedule 09.08.2015