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

如何在Umbraco中调用自定义Api Controller的Action方法

在Umbraco中调用自定义API控制器的Action方法

下面是几种在后端代码里调用BlogCommentsController的GetComments方法的实用方式:

1. 直接实例化控制器(处理依赖注入)

如果你的控制器有依赖服务(比如ICommentService),可以通过构造函数注入获取依赖后,直接实例化控制器调用方法:

// 假设在自定义服务中,通过构造函数注入所需依赖
private readonly ICommentService _commentService;
private readonly ILogger<BlogCommentsController> _logger;

public YourCustomService(ICommentService commentService, ILogger<BlogCommentsController> logger)
{
    _commentService = commentService;
    _logger = logger;
}

public async Task<List<Comment>> GetBlogComments()
{
    // 实例化目标控制器
    var controller = new BlogCommentsController(_commentService, _logger);
    // 调用Action方法
    var comments = await controller.GetComments();
    return comments;
}

注意:这种方法适合无HttpContext依赖的场景,如果控制器需要访问请求头、身份信息等,该方式无法提供有效上下文。

2. 使用HttpClient发起HTTP请求

如果需要模拟真实HTTP请求(比如带身份验证、请求头),可以用HttpClient调用API接口:

private readonly HttpClient _httpClient;
private readonly IHttpContextAccessor _httpContextAccessor;

public YourCustomService(HttpClient httpClient, IHttpContextAccessor httpContextAccessor)
{
    _httpClient = httpClient;
    // 传递当前用户的Cookie或身份令牌(按需)
    var currentRequest = _httpContextAccessor.HttpContext.Request;
    if (!string.IsNullOrEmpty(currentRequest.Headers["Cookie"]))
    {
        _httpClient.DefaultRequestHeaders.Add("Cookie", currentRequest.Headers["Cookie"].ToString());
    }
}

public async Task<List<Comment>> FetchBlogComments()
{
    var apiUrl = "/Umbraco/Api/BlogComments/GetComments";
    var comments = await _httpClient.GetFromJsonAsync<List<Comment>>(apiUrl);
    return comments;
}

这种方式完全模拟前端调用场景,适合需要完整HTTP上下文的情况,但会产生额外网络开销。

3. 使用Umbraco的IApiControllerFactory创建控制器

Umbraco提供的IApiControllerFactory能更好地处理控制器的依赖注入和生命周期,是推荐的后端调用方式:

private readonly IApiControllerFactory _apiControllerFactory;
private readonly IHttpContextAccessor _httpContextAccessor;

public YourCustomService(IApiControllerFactory apiControllerFactory, IHttpContextAccessor httpContextAccessor)
{
    _apiControllerFactory = apiControllerFactory;
    _httpContextAccessor = httpContextAccessor;
}

public async Task<List<Comment>> GetCommentsViaFactory()
{
    // 创建控制器实例并关联当前HttpContext
    var controller = _apiControllerFactory.CreateController<BlogCommentsController>(_httpContextAccessor.HttpContext);
    
    try
    {
        // 调用Action方法
        var comments = await controller.GetComments();
        return comments;
    }
    finally
    {
        // 释放控制器资源
        _apiControllerFactory.ReleaseController(controller);
    }
}

额外说明

  • 如果GetComments需要参数,直接在调用时传入即可,比如controller.GetComments(blogId)
  • 若涉及权限验证,确保调用上下文携带足够的用户身份信息(比如Claims)
  • 高频调用场景下,优先选择直接实例化或工厂方式,避免HttpClient的网络开销

内容的提问来源于stack exchange,提问作者Akimetheus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:55:06