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

如何在Acumatica扩展库中集成自定义Web API端点并完成注册?

集成自定义Web API到Acumatica扩展库的实现指引

我来给你一步步拆解这个集成方案,都是实际项目里验证过的方法,刚好解决你说的“扩展库加载时完成注册”的需求:

1. 创建符合Acumatica规范的Web API控制器

首先要写你的Api Controller,注意要继承Acumatica封装后的ApiController,同时加上路由和权限相关的特性:

using System.Web.Http;
using PX.Web.Api;
using PX.Data;

[RoutePrefix("api/customdata")]
[PXAuthorize] // 用Acumatica的权限验证,不要用ASP.NET原生的Authorize
public class CustomDataController : ApiController
{
    // 属性路由示例,接收POST请求写入多DAC
    [HttpPost]
    [Route("submit")]
    public IHttpActionResult SubmitData(CustomDataInputModel input)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        try
        {
            // 用PXScope包裹事务,确保Acumatica的上下文正确
            using (new PXScope())
            {
                // 实例化自定义Graph来操作DAC
                var dataGraph = PXGraph.CreateInstance<CustomDataProcessingGraph>();

                // 写入第一个DAC
                var dac1 = new FirstDAC();
                dac1.FieldA = input.FieldA;
                dac1.FieldB = input.FieldB;
                dataGraph.FirstDACs.Insert(dac1);

                // 关联写入第二个DAC
                var dac2 = new SecondDAC();
                dac2.FirstDACID = dac1.FirstDACID;
                dac2.FieldC = input.FieldC;
                dataGraph.SecondDACs.Insert(dac2);

                // 提交保存
                dataGraph.Actions.PressSave();

                return Ok(new { Success = true, Message = "数据写入成功" });
            }
        }
        catch (PXException ex)
        {
            return BadRequest($"Acumatica操作异常:{ex.Message}");
        }
        catch (Exception ex)
        {
            return InternalServerError($"系统异常:{ex.Message}");
        }
    }
}

// 自定义输入模型,用来接收外部传入的数据
public class CustomDataInputModel
{
    public string FieldA { get; set; }
    public int FieldB { get; set; }
    public string FieldC { get; set; }
}

// 自定义Graph,封装多DAC的操作逻辑
public class CustomDataProcessingGraph : PXGraph<CustomDataProcessingGraph>
{
    public PXSelect<FirstDAC> FirstDACs;
    public PXSelect<SecondDAC> SecondDACs;
}

2. 在扩展库加载时注册Web API路由

要让Acumatica启动时自动加载你的API路由,需要创建一个启动类,实现IPXPlugin接口并标记[PXStartup]特性,这样扩展库加载时就会执行初始化逻辑:

using System.Web.Routing;
using PX.Core;
using System.Web.Http;

[PXStartup]
public class CustomApiInitializer : IPXPlugin
{
    public void Initialize()
    {
        // 启用属性路由(适配控制器上的RoutePrefix/Route特性)
        GlobalConfiguration.Configuration.MapHttpAttributeRoutes();

        // 可选:如果需要传统路由,也可以手动注册
        RouteTable.Routes.MapHttpRoute(
            name: "LegacyCustomApi",
            routeTemplate: "api/legacycustom/{controller}/{action}",
            defaults: new { action = "Get" }
        );
    }
}

注意:[PXStartup]标记的类会在Acumatica应用启动时被自动调用,不管是IIS重启还是应用池回收,都能保证路由被注册。

3. 扩展库打包与部署注意事项

  • 确保你的扩展库项目引用了必要的Acumatica程序集:PX.Data.dll、PX.Web.Api.dll、System.Web.Http.dll等
  • 编译后的DLL可以直接部署到Acumatica站点的Bin目录,或者通过Acumatica的自定义包(Customization Package)导入部署
  • 如果用自定义包部署,要把控制器类、启动类、Graph类、模型类都包含在包的“Code”部分

4. 权限与安全补充

  • 不要随便用[AllowAnonymous],除非你的API完全公开,否则用[PXAuthorize]继承Acumatica的用户权限体系
  • 可以在控制器方法里额外检查特定权限,比如:
    if (!PXAccess.HasPermission(PXAccessRights.Insert, typeof(FirstDAC)))
    {
        return Unauthorized();
    }
    
  • 对于敏感数据,建议在Acumatica后台配置强制HTTPS

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:19:53