如何在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
相关产品推荐
相关产品推荐

