asp.net-core - 找不到 ASP.NET Core ODataController
问题描述
我正在尝试在现有的 ASP.NET (.net5) api 中构建一个非常简单的 odata 服务。
使用:
<PackageReference Include="Microsoft.AspNetCore.OData" Version="8.0.0-rc3" />
我认为这很简单(我只需要支持 GET 和 Get-$count),但我一定遗漏了一些东西。
这是我所拥有的:
模型:
public partial class MySuspension
{
public long Id { get; set; }
[Required]
[StringLength(50)]
public string AccountName { get; set; }
[Column(TypeName = "datetime")]
public DateTime RegisteredDate { get; set; }
[StringLength(8)]
public string Responder { get; set; }
public long? UnblockPermissions { get; set; }
}
我正在为 db-access 使用实体框架,因此为 EF 生成了模型类(因此有一些属性)。
启动:
这是“配置”方法的基本顺序:
app.UseMiddleware<GlobalExceptionHandlerMiddleware>();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseODataRouteDebug(); ///// <----
app.UseODataQueryRequest();///// <----
app.UseODataBatching();///// <----
app.UseCors("InternalApplications");
app.UseAuthentication();
app.UseRouting();
app.UseAuthorization();
app.UseRequestLocalization(app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value);
UseSwagger(app);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapHealthChecks("/health");
});
我像这样注册我的控制器:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("ActSus");
var model0 = builder.GetEdmModel();
services.AddControllers()
.AddOData(opt =>
{
opt.AddModel("data",model0)
.Count().Filter().Expand()
.Select().OrderBy()
.SetMaxTop(null);
});
上述设置非常适用于“普通”api 方法,因此不存在任何 auth/cors 问题。
控制器:
public class AccountActionController : ODataController
{
private readonly MyDbContext _dbContext;
public AccountActionController(MyDbContext dbContext)
{
_dbContext = dbContext;
}
[EnableQuery]
[HttpGet]
public IActionResult Get()
{
return Ok(_dbContext.AccountSuspensions);
}
}
据我了解,这应该可行。我从 OdataController 继承了 - 这(我认为)意味着我不需要使用任何其他属性。我认为即使是 HttpGet 和 EnableQuery 属性也可能是多余的。
但是,当我运行它时,odata 路由调试页面显示 ~/data 和 ~/data/$metadata 作为唯一的 OData 端点。
~/data/$metadata 显示了一个正确的 XML 文档,它准确地定义了我的 MySuspension 对象。
AccountActionController 不会出现在 Odata 端点或非 Odata 端点中!!!
啊啊啊!!!挫折!!!
我知道我是个白痴,但我一辈子都看不到我做错了什么。
任何帮助将非常感激。
谢谢。
解决方案
AccountActionController 不会出现在 Odata 端点或非 Odata 端点中!!!
var builder = new ODataConventionModelBuilder(); builder.EntitySet<MySuspension>("ActSus"); var model0 = builder.GetEdmModel();
问题与上述代码有关,由于Controller的名称是AccountAction
,您应该将实体集名称从 更改ActSus
为AccountAction
,代码如下:
var builder = new ODataConventionModelBuilder();
builder.EntitySet<MySuspension>("AccountAction"); //change the name.
var model0 = builder.GetEdmModel();
services.AddControllers().AddOData(opt =>
opt.AddModel("odata", model0)
.Count().Filter().Expand()
.Select().OrderBy()
.SetMaxTop(null)
);
然后结果是这样的:
如果要更改请求 url,请尝试使用ASP.NET Core OData 8.0 RC 中的属性路由。
推荐阅读
- python - 使用 Selenium Requests 库向 selenium 添加自定义标头
- python - 如何正确配置 VSCode 以正确格式化 python 代码
- python - 如何使用 Playwright 下载 PDF 文件?(Python)
- .net-5 - Rollbar 日志在 .Net(core) 5.0 中不起作用
- php - Laravel:查询构建器
- reactjs - 如何创建不确定复选框的混合实现?
- qt - QML StackView push() 函数,给出“无推送”
- javascript - 如何在数组中插入新行?
- node.js - 为什么我的本地端口转发不允许我通过 Nodejs 的公共 EC2 实例连接到私有 AWS Oracle RDS?
- python - 以太坊 ropsten 网络中的交易