.Net core 3.1 + GraphQL == ›ошибка: неожиданный конец ввода JSON

Я разработал веб-API для .NET core 3.1 и добавил к нему GraphQL и PlayGround. Когда я пытаюсь запустить Playground, я столкнулся с этой наскучившей ошибкой. Я гуглил слишком много раз, читал много статей и форумов об этом, пробовал их предлагаемые способы, но проблема все же существует. Кроме того, я должен сказать, что у меня нет этой проблемы с .net core 2.2.

Я решил упростить свое решение и удалить лишнюю листву из моего проекта и загрузить его вам, чтобы вы могли мне помочь. Упрощенная версия этого проекта, над которым я сейчас работаю, доступна здесь на гугл драйв.
Кроме того, я нашел решение с .net core 3.1, которое не имеет этой проблемы, но все же я не могу найти свою ошибку (и). Я загрузил это правильное решение здесь.

В этой упрощенной версии я не подключался к базе данных и не добавлял в проект никаких связанных с ней пакетов. Я возвращаю данные в памяти в этой упрощенной версии вместо обращения к базе данных.

Это изображение ошибки, с которой я столкнулся:  введите описание изображения здесь

И файл .csproj упрощенного проекта выглядит следующим образом:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>NetCore3._1GraphQL</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="graphiql" Version="1.2.0" />
    <PackageReference Include="GraphQL" Version="3.0.0-preview-1352" />
    <PackageReference Include="GraphQL.Server.Ui.Playground" Version="3.4.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.1" />
    <PackageReference Include="RandomNameGeneratorLibrary" Version="1.2.2" />
  </ItemGroup>

</Project>

person Milad Rashidi    schedule 16.02.2020    source источник


Ответы (2)


В зависимости от упрощенного и ошибочного проекта, afaict, он настроен с маршрутизацией, которая сопоставляет конечную точку /graphql с контроллером, но не содержит соответствующий контроллер. Итак, сервер возвращает ответ 404, а игровая площадка graphql выдает сообщение об ошибке. Добавление контроллера (или промежуточного программного обеспечения) заставило его работать.

Ниже приведены изменения в упрощенном и ошибочном проекте, благодаря которым он заработал:

  1. Добавьте контроллер api, соответствующий /graphql маршрутизации.
// GraphqlController.cs
// using statements are omitted
namespace NetCore3._1GraphQL.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class GraphqlController : ControllerBase
    {
        private readonly IServiceProvider _provider; 
        private readonly IDocumentExecuter _executer;
        private readonly IDataLoaderContextAccessor _loader;

        public GraphqlController(
            IDocumentExecuter executer,
            IServiceProvider provider, 
            IDataLoaderContextAccessor loader)
        {
            _executer = executer;
            _provider = provider;
            _loader = loader;
        }

        [HttpPost]
        public async Task<IActionResult> Post([FromBody] GraphQLRequest graphQLRequest)
        {
            if (graphQLRequest == null)
            {
                throw new ArgumentNullException(nameof(graphQLRequest));
            }

            var _query = graphQLRequest.Query;
            var _inputs = graphQLRequest.Variables?.ToObject<Inputs>();
            var _options = new ExecutionOptions
            {
                Schema = new GraphQLSchema(_provider)
                {
                    Query = new GraphQLQuery(_loader),
                },
                Query = _query,
                Inputs = _inputs,
                FieldNameConverter = new PascalCaseFieldNameConverter()
            };

            try
            {
                var result = await _executer.ExecuteAsync(_options).ConfigureAwait(false);

                if (result.Errors?.Count > 0)
                {
                    return BadRequest(result);
                }

                return Ok(result);
            }
            catch (Exception ex)
            {
                return BadRequest(ex);
            }
        }
    }
}

  1. Раскомментируйте строку public JObject Variables { get; set; } в BaseGraphQLQuery.cs.

  2. BaseGraphQLQuery - это реализация запроса GraphQL, а не запроса GraphQL. Переименуйте его как GraphQLRequest или измените имя параметра в пост-действии контроллера на BaseGraphQLQuery.

Успешный запрос с приложением Graphql Playground.

person moustapha    schedule 08.01.2021
comment
Спасибо @moustapha. Я сейчас очень занят, но проверю ваш ответ как можно скорее. - person Milad Rashidi; 11.01.2021
comment
Я проверил ваш ответ, и вы были правы. Год назад, когда я скачал этот проект из Интернета, я был новичком в GraphQL и не знал, что должен быть контроллер для обработки запросов GraphQL. Но давайте добавим этот момент к вашему ответу, чтобы было удобнее для других читателей этого вопроса. Измените строку 76, в которой приложение использовало инструмент GraphQLPlayground, следующим образом: app.UseGraphQLPlayground(options: new GraphQLPlaygroundOptions() { Path = "/graphqlplayground", GraphQLEndPoint = "/graphql" });, и PlayGround появится на этом localhost: 44313 / graphqlplayground - person Milad Rashidi; 12.02.2021

добавить в startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        //add this
        services.AddSingleton<MyAppSchema>();
    }
person AAI INGENIERIA    schedule 04.01.2021