我正在尝试将一个非常简单的odata服务构建到现有的ASP.NET (.net5) api中。
使用:
<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路由调试页面显示~/ OData和~/data /$元数据是唯一的端点。
~/data/$元数据显示了一个正确的XML文档,它准确地定义了我的MySuspension对象。
AccountActionController既不会出现在Odata端点中,也不会出现在非数据端点中!
啊!沮丧!
我知道我是个白痴,但我不能从我的生活中看出我做错了什么。
任何帮助都会很感激的。
谢谢。
发布于 2021-06-22 06:56:46
AccountActionController既不会出现在Odata端点中,也不会出现在非数据端点中! var builder =新的ODataConventionModelBuilder();builder.EntitySet("ActSus");var model0 = builder.GetEdmModel();
这个问题与上面的代码有关,因为控制器的名称是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.0RC中的属性路由。
https://stackoverflow.com/questions/68069798
复制相似问题