4

我开发了一个 .net core 3.1 Web API,并在其中添加了GraphQLPlayGround。当我尝试启动 Playground 时,我遇到了这个让我厌烦的错误。我用谷歌搜索了太多次,我已经阅读了很多关于它的文章和论坛,我已经尝试了他们建议的方法,但问题仍然存在。另外,我应该说.net core 2.2没有这个问题。

我决定简化我的解决方案并删除我的项目的额外叶子并将其上传给你,你可以帮助我。我目前正在处理的那个项目的简化版本可以在 google drive 上找到。
此外,我找到了一个没有这个问题的 .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>
4

2 回答 2

1

根据简化和错误的项目,afaict,它配置有将/graphql端点映射到控制器但不包含匹配控制器的路由。因此,服务器返回 404 响应,graphql playground 产生错误消息。添加控制器(或中间件)使其工作。

以下是使其工作的简化和错误项目的更改:

  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或将控制器的 post 操作中的参数名称更改为BaseGraphQLQuery.

使用 Graphql Playground 应用程序成功查询。

于 2021-01-08T02:30:56.287 回答
0

添加startup.cs

public void ConfigureServices(IServiceCollection services)
    {
        //add this
        services.AddSingleton<MyAppSchema>();
    }
于 2021-01-04T18:21:52.837 回答