You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:05:17