ASP.NET Core 6中如何通过HotChocolate在内部调用GraphQL获取PDF数据?
在ASP.NET Core 6中内部调用HotChocolate GraphQL获取数据
在你的ASP.NET Core 6应用里,无需通过HTTP请求调用GraphQL接口,直接利用HotChocolate提供的IRequestExecutor就能在服务内部执行查询,具体实现步骤如下:
1. 确认GraphQL服务配置完成
首先检查Program.cs中已正确注册HotChocolate服务,确保IRequestExecutor可被正常注入:
builder.Services.AddGraphQLServer() .AddQueryType<Query>() // 根据需求添加其他配置(如类型扩展、过滤器、投影等) .AddProjections();
2. 在PDF生成服务中注入IRequestExecutor
修改或创建你的PDF生成服务,注入IRequestExecutor实例:
public class PdfGenerationService { private readonly IRequestExecutor _requestExecutor; public PdfGenerationService(IRequestExecutor requestExecutor) { _requestExecutor = requestExecutor; } // 生成PDF的核心方法 }
3. 构建并执行GraphQL查询
在服务方法中构建查询字符串、定义变量,通过IRequestExecutor执行查询并映射结果到业务模型:
public async Task<byte[]> GenerateOrderPdfAsync(int orderId) { // 构建目标数据的GraphQL查询 var query = $@" query GetOrderData($orderId: Int!) {{ order(id: $orderId) {{ id customerName orderDate items {{ productName quantity price }} totalAmount }} }}"; // 传入查询变量 var variables = new Dictionary<string, object> { { "orderId", orderId } }; // 执行查询 var result = await _requestExecutor.ExecuteAsync(options => { options.Query = query; options.Variables = variables; }); // 处理查询错误 if (result.Errors != null && result.Errors.Any()) { throw new InvalidOperationException($"GraphQL查询失败: {string.Join(", ", result.Errors.Select(e => e.Message))}"); } // 将查询结果映射到业务模型 var orderData = result.Data?.GetValue<OrderDto>("order"); if (orderData == null) { throw new KeyNotFoundException("未找到指定订单的数据"); } // 调用PDF生成逻辑(示例用占位方法) return CreatePdfFromOrderData(orderData); } // 示例PDF生成逻辑(需替换为实际PDF库实现,如iTextSharp、PdfSharp等) private byte[] CreatePdfFromOrderData(OrderDto order) { using var ms = new MemoryStream(); // 此处编写PDF文档创建、内容填充逻辑 return ms.ToArray(); } // 业务模型定义 public class OrderDto { public int Id { get; set; } public string CustomerName { get; set; } public DateTime OrderDate { get; set; } public List<OrderItemDto> Items { get; set; } public decimal TotalAmount { get; set; } } public class OrderItemDto { public string ProductName { get; set; } public int Quantity { get; set; } public decimal Price { get; set; } }
4. 在API接口中暴露PDF生成端点
在API控制器中注入PdfGenerationService,提供接口供外部调用:
[ApiController] [Route("api/pdf")] public class PdfController : ControllerBase { private readonly PdfGenerationService _pdfService; public PdfController(PdfGenerationService pdfService) { _pdfService = pdfService; } [HttpGet("order/{orderId}")] public async Task<IActionResult> GetOrderPdf(int orderId) { var pdfBytes = await _pdfService.GenerateOrderPdfAsync(orderId); return File(pdfBytes, "application/pdf", $"Order_{orderId}.pdf"); } }
注意事项
- 确保GraphQL查询字段与业务模型属性名称匹配,如需自定义名称可使用
[GraphQLName]特性映射。 - 必须处理查询错误,避免未捕获异常导致服务异常。
- 复杂查询场景可使用HotChocolate的
QueryBuilder构建查询,替代字符串拼接提升安全性和可维护性。
内容的提问来源于stack exchange,提问作者Gabriel Santos Lemos
相关产品推荐
相关产品推荐

