Apex 22.1.0配置OData REST数据源时遇404错误求助
ASP.NET Core OData 8 API无法被Oracle APEX 22.1 OData Connector发现(404错误)
问题场景
- 已按《Getting Started with ASP.NET Core OData 8》创建OData API,浏览器直接访问以下端点均返回正常响应:
- 请求:
http://localhost:5164/odata/pls/v1/Customers响应:
{"@odata.context":"http://localhost:5164/odata/pls/v1/$metadata#Customers","value":[{"Id":1,"Name":"Customer 1"},{"Id":2,"Name":"Customer 2"},{"Id":3,"Name":"Customer 3"}]} - 请求:
http://localhost:5164/odata/pls/v1/Customers(1)响应:
{"@odata.context":"http://localhost:5164/odata/pls/v1/$metadata#Customers/$entity","Id":1,"Name":"Customer 1"}
- 请求:
- 按Oracle OData Connector指南配置插件后,在APEX 22.1.0中创建REST Data Source时,点击Discover按钮触发404错误
- 环境说明:本地APEX 22.1.0,已将
http://localhost:5164添加至数据库ACL,且APEX可正常访问http://localhost:5164/Login接口,OData API无需认证 - 补充:多次验证OData端点响应正常,但问题未解决
排查与解决建议
1. 验证APEX服务器能否访问OData元数据端点
APEX的OData Connector依赖$metadata端点获取数据源结构,需确认APEX所在数据库服务器可访问该端点。执行以下PL/SQL代码测试:
DECLARE l_request UTL_HTTP.req; l_response UTL_HTTP.resp; l_text VARCHAR2(32767); BEGIN l_request := UTL_HTTP.begin_request('http://localhost:5164/odata/pls/v1/$metadata'); l_response := UTL_HTTP.get_response(l_request); UTL_HTTP.read_text(l_response, l_text); DBMS_OUTPUT.put_line(l_text); UTL_HTTP.end_response(l_response); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line('Error: ' || SQLERRM); IF UTL_HTTP.is_response_open(l_response) THEN UTL_HTTP.end_response(l_response); END IF; END; /
若返回错误,说明APEX服务器无法正确获取元数据,需排查网络连通性或API的元数据配置。
2. 确认OData API的元数据与路由配置
检查ASP.NET Core OData的启动配置,确保$metadata端点正确暴露:
- 验证Program.cs/Startup.cs中的路由配置,确保路径匹配:
app.UseEndpoints(endpoints => { endpoints.MapODataRoute("odata", "odata/pls/v1", GetEdmModel()); endpoints.MapControllers(); });
- 确认
GetEdmModel()方法正确构建了包含Customers实体集的EDM模型,示例:
private static IEdmModel GetEdmModel() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Customer>("Customers"); return builder.GetEdmModel(); }
3. 修正APEX REST Data Source配置细节
- 创建REST Data Source时,选择OData类型,服务URL需填写为
http://localhost:5164/odata/pls/v1/(注意末尾的斜杠) - 认证方式选择No Authentication,匹配API的无认证要求
- 若自动发现失败,尝试手动指定元数据URL为
http://localhost:5164/odata/pls/v1/$metadata,再点击Discover
4. 检查数据库ACL的完整配置
确认ACL规则覆盖了API的所有子路径,执行以下SQL查看当前ACL配置:
SELECT host, lower_port, upper_port, acl FROM dba_network_acls;
若仅添加了http://localhost:5164,需确保规则允许访问该域名下的所有子路径,可通过重新添加ACL并指定端口范围(如80-65535)来覆盖。
5. 配置API的CORS策略
尽管APEX是服务器端访问,但API的CORS限制可能影响请求。在ASP.NET Core中添加宽松的CORS策略(仅用于测试,生产环境需调整):
builder.Services.AddCors(options => { options.AddPolicy("AllowAll", policy => policy.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); }); // 确保CORS中间件在OData路由之前注册 app.UseCors("AllowAll"); app.UseEndpoints(endpoints => { endpoints.MapODataRoute("odata", "odata/pls/v1", GetEdmModel()); endpoints.MapControllers(); });
内容的提问来源于stack exchange,提问作者bjan
相关产品推荐
相关产品推荐

