U9 WebAPI无授权开发方案实操

通过Visual Studio 2022直接开发类库项目(选择"类库(.NET Framework)")来实现WebAPI功能,这种方式不仅灵活高效,还能避免UBF平台的各种限制。

1、引用U9类库及部署方式

2、具体代码

/// <summary>

/// 查询组织数据(示例接口)

/// 说明:

/// 1. 使用 U9 无授权模式(BPForEngine + ContextDTO)

/// 2. 统一返回 ResultDTO,便于前端/第三方系统解析

/// 3. 所有异常统一收敛到 ErrMsg,避免直接抛到 IIS

/// </summary>

/// <returns>统一 ResultDTO,Data 中为组织列表</returns>

HttpGet

Route("webapi/query")

public IHttpActionResult QueryData()

{

// ✅ 初始化统一返回对象(所有接口统一使用 ResultDTO)

ResultDTO result = new ResultDTO

{

IsSuccessed = false,

ErrMsg = string.Empty,

Data = null

};

try

{

/*

* 【U9 无授权模式核心】

* 必须放在 using (BPForEngine) 中

* 否则 ContextDTO 无法正确写入 U9 运行上下文

*/

using (BPForEngine bp = new BPForEngine())

{

// 1. 构造并写入 U9 上下文

ContextDTO cdto = new ContextDTO

{

// 企业编码:对应 U9 Enterprise

EntCode = "100",

// 组织编码:决定 SQL 查询时的 Org 过滤

OrgCode = "100",

// 用户编码:影响权限、日志、审计

UserCode = "admin",

// 语言区域:固定 zh-CN,避免多语资源问题

CultureName = "zh-CN"

};

// ✅ 写入当前线程的 U9 Context(关键步骤)

cdto.WriteToContext();

// 2. 构造 SQL

string sql = @"SELECT * FROM Base_Organization_Trl";

// 3. 执行查询

DataSet dataSet;

DataParamList dataParams = new DataParamList();

/*

* DataAccessor.RunSQL 说明:

* - GetConn():从 U9 连接池获取当前上下文数据库连接

* - out dataSet:查询结果输出

*/

DataAccessor.RunSQL(

DataAccessor.GetConn(),

sql,

dataParams,

out dataSet

);

// 4. 数据校验

if (dataSet == null ||

dataSet.Tables.Count == 0 ||

dataSet.Tables0.Rows.Count == 0)

{

throw new Exception("未查询到有效的组织数据");

}

// 5. 将 DataTable 转换为 List<Dictionary<string, object>>

// 原因:

// - JSON 序列化后结构清晰

// - 前端无需关心 DataTable / DataSet

var orgList = new List<Dictionary<string, object>>();

foreach (DataRow row in dataSet.Tables0.Rows)

{

var dict = new Dictionary<string, object>();

foreach (DataColumn col in dataSet.Tables0.Columns)

{

dictcol.ColumnName = rowcol;

}

orgList.Add(dict);

}

// 6. 封装成功返回结果

result.IsSuccessed = true;

result.ErrMsg = "success";

result.Data = orgList;

}

}

catch (Exception ex)

{

/*

* 统一异常处理:

* - 不对外暴露堆栈(生产安全要求)

* - 所有错误信息收敛到 ErrMsg

*/

result.IsSuccessed = false;

result.ErrMsg = ex.Message;

}

// 7. 返回标准 JSON 结果

return Ok(result);

}

效果如下图