Действия контроллера 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)


arrow_upward
10
arrow_downward

Как указал @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

arrow_upward
3
arrow_downward

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

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

person mbudnik    schedule 09.08.2015