通过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);
}
效果如下图
