当前位置:首页 > 行业动态 > 正文

如何在ASP.NET Core中使用GraphQL作为中间件?

ASP.NET Core 使用 GraphQL 中间件,可以通过安装 GraphQL 包并配置服务来实现。

ASP.NET Core 使用 GraphQL 的中间件

如何在ASP.NET Core中使用GraphQL作为中间件?  第1张

在现代 Web 开发中,GraphQL 作为一种强大的查询语言,正逐渐取代传统的 RESTful API,结合 ASP.NET Core,开发者可以构建灵活、高效的后端服务,本文将详细探讨如何在 ASP.NET Core 中使用中间件处理 GraphQL 请求,包括从基础设置到高级功能的各个方面。

一、什么是中间件?

中间件是装载在应用程序管道中的组件,负责处理请求和响应,每一个中间件可以选择是否传递请求到应用程序管道中的下一个组件,中间件是一个委托,或者更精确地说是一个请求委托(Request Delegate),正如其名字所暗示的,中间件会处理请求,并决定是否将其委托到应用程序管道中的下一个中间件中,在我们前面的例子中,我们使用 IApplicationBuilder 类的 Run() 方法配置了一个请求委托。

二、使用动态查询体替换硬编码查询体

在我们之前的例子中,中间件中的代码非常简单,它仅是返回了一个固定查询的结果,然而在现实场景中,查询应该是动态的,因此我们必须从请求中读取查询体,在服务器端,每一个请求委托都可以接受一个 HttpContext 参数,如果一个查询体是通过 POST 请求发送到服务器的,你可以很容易地使用以下代码获取到请求体中的内容:

在获取请求体内容之前,为了不引起任何问题,我们需要先检测一些当前请求是否是一个 POST 请求以及是否使用了特定的 URL,/api/graphql,因此我们需要对代码进行调整。

实现步骤

1、安装必要的 NuGet 包

确保你已经安装了 GraphQL 的相关包,你可以使用以下命令安装:

   Install-Package GraphQL
   Install-Package GraphQL.Server.Transports.AspNetCore

2、创建必要的类

你需要定义你的模式(Schema)和查询(Query),以下是一个简单的例子:

   public class Query
   {
       [UseGraphQL]
       public string Hello(string name) => $"Hello, {name}!";
   }
   public class MySchema : Schema
   {
       public MySchema(IServiceProvider serviceProvider) : base(serviceProvider)
       {
           Query = serviceProvider.GetRequiredService<Query>();
       }
   }

3、配置中间件

在Startup.cs 文件中配置中间件:

   public void ConfigureServices(IServiceCollection services)
   {
       services.AddGraphQL(b => b
           .AddSchema<MySchema>()
           .AddGraphTypes(typeof(MySchema).Assembly));
   }
   public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
   {
       if (env.IsDevelopment())
       {
           app.UseDeveloperExceptionPage();
       }
       app.UseRouting();
       app.UseEndpoints(endpoints =>
       {
           endpoints.MapGraphQL();
       });
   }

4、处理动态查询

修改中间件以处理动态查询:

   public async Task InvokeAsync(HttpContext context)
   {
       if (context.Request.Path.StartsWithSegments("/api/graphql") && context.Request.Method == "POST")
       {
           string query;
           using (var streamReader = new StreamReader(context.Request.Body))
           {
               query = await streamReader.ReadToEndAsync();
           }
           var request = JsonConvert.DeserializeObject<GraphQLRequest>(query);
           var result = await new DocumentExecuter().ExecuteAsync(new ExecutionOptions
           {
               Schema = schema,
               Query = request.Query,
               Inputs = new Dictionary<string, object>(), // Add variables here if needed
           }).ConfigureAwait(false);
           var json = new DocumentWriter(indent: true).Write(result);
           await context.Response.WriteAsync(json);
       }
       else
       {
           await context.Response.WriteAsync("404 Not Found");
       }
   }

三、依赖注入与服务定位

在复杂的应用中,依赖注入(DI)和服务定位是不可或缺的,ASP.NET Core 提供了强大的 DI 功能,使得在中间件中注入服务变得非常容易,你只需要在Startup.cs 中注册你的服务,然后在中间件中通过构造函数注入即可。

示例代码

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<IMyService, MyService>();
    services.AddGraphQL(b => b.AddSchema<MySchema>());
}
// Middleware.cs
public class MyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IMyService _myService;
    public MyMiddleware(RequestDelegate next, IMyService myService)
    {
        _next = next;
        _myService = myService;
    }
    public async Task InvokeAsync(HttpContext context)
    {
        // Use _myService here if needed
        await _next(context);
    }
}

四、错误处理和日志记录

在生产环境中,错误处理和日志记录是必不可少的,你可以在中间件中添加错误处理逻辑,并将错误信息记录到日志中,ASP.NET Core 提供了丰富的日志记录功能,可以轻松集成到你的中间件中。

到此,以上就是小编对于“ASP.NET Core使用GraphQL之中间件”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。

0