Graphql .Net核心3.1+;图形ql==>&引用;错误";:&引用;JSON输入意外结束“;

Graphql .Net核心3.1+;图形ql==>&引用;错误";:&引用;JSON输入意外结束“;,graphql,.net-core-3.1,graphql-playground,Graphql,.net Core 3.1,Graphql Playground,我开发了一个.net core 3.1 web API,并在其中添加了GraphQL和游乐场。当我试图启动操场时,我遇到了这个让我厌烦的错误。我在谷歌上搜索了太多次,我读了很多关于它的文章和论坛,我尝试了他们建议的方法,但问题仍然存在。另外,我应该说我对.NETCore2.2没有这个问题 我决定简化我的解决方案,去掉项目中多余的枝叶,然后上传给你,你可以帮助我。 我目前正在做的那个项目的简化版本已经发布了。 此外,我还找到了一个使用.net core 3.1的解决方案,该解决方案没有这个问题,

我开发了一个.net core 3.1 web API,并在其中添加了GraphQL游乐场。当我试图启动操场时,我遇到了这个让我厌烦的错误。我在谷歌上搜索了太多次,我读了很多关于它的文章和论坛,我尝试了他们建议的方法,但问题仍然存在。另外,我应该说我对.NETCore2.2没有这个问题

我决定简化我的解决方案,去掉项目中多余的枝叶,然后上传给你,你可以帮助我。 我目前正在做的那个项目的简化版本已经发布了。
此外,我还找到了一个使用.net core 3.1的解决方案,该解决方案没有这个问题,但仍然找不到我的错误。我已经上传了这个正确的解决方案

在这个简化版本中,我没有连接到数据库,也没有向项目中添加任何相关的包。我返回这个简化版本的内存数据,而不是联系数据库

这是我面临的错误的图片:

简化项目的.csproj文件如下:


netcoreapp3.1
NetCore3._1GraphQL
在startup.cs中添加

public void ConfigureServices(IServiceCollection services)
    {
        //add this
        services.AddSingleton<MyAppSchema>();
    }
public void配置服务(IServiceCollection服务)
{
//加上这个
services.AddSingleton();
}

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

以下是对简化且错误的项目所做的更改,这些更改使该项目得以运行:

  • 添加与
    /graphql
    路由匹配的api控制器
  • //GraphqlController.cs
    //省略using语句
    命名空间NetCore3.\u 1GraphQL.Controllers
    {
    [ApiController]
    [路线(“[控制器]”)]
    公共类GraphqlController:ControllerBase
    {
    专用只读服务器ViceProvider(提供程序);
    私有只读IDocumentExecuter\u executer;
    专用只读IDataLoaderContextAccessor\u加载程序;
    公共图形控制器(
    i文档执行器执行器,
    IServiceProvider提供程序,
    IDataLoaderContextAccessor加载程序)
    {
    _执行者=执行者;
    _提供者=提供者;
    _装载机=装载机;
    }
    [HttpPost]
    公共异步任务Post([FromBody]GraphQLRequest GraphQLRequest)
    {
    if(graphQLRequest==null)
    {
    抛出新ArgumentNullException(nameof(graphQLRequest));
    }
    var\u query=graphQLRequest.query;
    var_inputs=graphQLRequest.Variables?.ToObject();
    var\u options=新的执行选项
    {
    Schema=新的GraphQLSchema(_提供程序)
    {
    Query=newgraphqlquery(_加载器),
    },
    查询=\u查询,
    输入=_输入,
    FieldNameConverter=新的PascalCaseFieldNameConverter()
    };
    尝试
    {
    var result=await _executer.ExecuteAsync(_选项).ConfigureAwait(false);
    如果(结果错误?.Count>0)
    {
    返回请求(结果);
    }
    返回Ok(结果);
    }
    捕获(例外情况除外)
    {
    返回请求(ex);
    }
    }
    }
    }
    
  • 取消注释
    BaseGraphQLQuery.cs
    中的行
    publicjobject变量{get;set;}

  • BaseGraphQLQuery
    类是GraphQL请求的实现,而不是GraphQL查询。将其重命名为
    GraphQLRequest
    ,或将控制器post操作中的参数名称更改为
    BaseGraphQLQuery


  • 谢谢@moustapha。我现在很忙,但我会尽快检查你的答案。我检查了你的答案,你是对的。一年前,当我从互联网上下载这个项目时,我是GraphQL的初学者,不知道必须有一个控制器来处理GraphQL请求。但让我们在你的答案中添加这一点,以便更好地为其他读者解答这个问题。更改第76行中应用程序使用GraphQlPlayerly工具的位置,如下所示:
    app.usegraphQlPlayerly(选项:新建GraphQLPlaygroundOptions(){Path=“/GraphQlPlayerly”,GraphQLEndPoint=“/graphql”})此时将显示操场